Создать новый фрейм данных на основе строк с определенным значением - PullRequest
0 голосов
/ 23 июня 2018

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

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])

Ответы [ 3 ]

0 голосов
/ 23 июня 2018

Используя 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}
0 голосов
/ 23 июня 2018

Как сказал @trollster, действительно лучше создавать кадры данных для 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 список с одним элементом i (целое число). Если вы хотите добавить всю строку, вы должны использовать:

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

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

0 голосов
/ 23 июня 2018

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

Предполагая, что ваш фрейм данных выглядит следующим образом:

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]

Чтобы создать фрейм данных для типов 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:

  Type  Dummy
3    P      4
4    P      5
6    P      7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...