Создать новый фрейм данных на основе строк с определенным значением

1

У меня есть большой блок данных транзакций, которые я хочу разбить на два меньших кадра данных на основе определенного столбца ("Тип"). Если "Тип" - "S", то добавьте эту целую строку в "cust_sell" dataframe, а если "Тип" - "P" в "cust_buy" dataframe. Я использую цикл for, но это только добавление значения индекса в dataframe. Любая помощь приветствуется!

from win32com.shell import shell, shellcon
import pandas as pd

filename = (shell.SHGetFolderPath(0, shellcon.CSIDL_PERSONAL, None, 0)) + '\MSRB T-1_test.xlsx'
wb = pd.read_excel(filename, sheet_name='T1-20062017', index_col=0, header=0)
cust_buy = []
cust_sell = []

# Create a list of customer buys and sells separately
for i in wb.index:
    if wb['Type'][i] == 'S':
        cust_sell.append([i])
    elif wb['Type'][i] == 'P':
        cust_buy.append([i])
Теги:
pandas
dataframe

3 ответа

6
Лучший ответ

Вам не нужно писать циклы. Вы можете сделать это легко с помощью панд.

Предполагая, что ваш dataframe выглядит так:

import pandas as pd  

mainDf = pd.DataFrame()
mainDf['Type'] = ['S', 'S', 'S', 'P', 'P', 'S', 'P', 'S']
mainDf['Dummy'] = [1, 2, 3, 4, 5, 6, 7, 8]

Чтобы создать dataframe для типов S и P, вы можете просто сделать это:

cust_sell = mainDf[mainDf.Type == 'S']
cust_buy = mainDf[mainDf.Type == 'P']

Результат cust_sell:

  Type  Dummy
0    S      1
1    S      2
2    S      3
5    S      6
7    S      8

cust_buy output:

  Type  Dummy
3    P      4
4    P      5
6    P      7
3

Как сказал @trollster, действительно лучше создать dataframes для cust_sell и cust_buy. Но дайте понять, что не работает с вашим кодом. Когда вы выполните:

for i in wb.index

это означает, что я возьму значения wb.index. И когда вы печатаете wb.index, вы получаете:

Int64Index([0, 1, 2, 3, 4, 5, 6, 7], dtype='int64')

Значение я будет принимать значения 1,2,3... Итак, когда вы делаете:

cust_sell.append([i])

то, что вы делаете, это добавить в список list_cust_sell список внутри одного элемента, я (целое число). Если вы хотите добавить всю строку, вы должны использовать:

cust_sell.append(list(wb.loc[i,:]))

Вы получите список списков, каждый из которых содержит строку

1

Используя dict + groupby вы можете создать словарь данных. Это решение не требует, чтобы вы вручную указывали все уникальные типы и более легко расширялись, чем ручной цикл.

Данные из @trollster.

res = dict(tuple(mainDf.groupby('Type')))

{'P':   Type  Dummy
      3    P      4
      4    P      5
      6    P      7,
 'S':   Type  Dummy
      0    S      1
      1    S      2
      2    S      3
      5    S      6
      7    S      8}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню