У меня есть большой блок данных транзакций, которые я хочу разбить на два меньших кадра данных на основе определенного столбца ("Тип"). Если "Тип" - "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])
Вам не нужно писать циклы. Вы можете сделать это легко с помощью панд.
Предполагая, что ваш 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
Как сказал @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,:]))
Вы получите список списков, каждый из которых содержит строку
Используя 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}