我有一个很大的交易数据框,我想根据某个列(“类型”)分成两个较小的数据框。如果“类型”为“ 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])
答案 0 :(得分:7)
您不需要编写循环。您可以使用熊猫轻松做到这一点。
假设您的数据框如下所示:
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
答案 1 :(得分:3)
就像@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,:]))
您将获得一个列表列表,每个列表包含一行
答案 2 :(得分: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}