根据具有特定值的行创建一个新的数据框

时间:2018-06-23 18:33:26

标签: python pandas dataframe

我有一个很大的交易数据框,我想根据某个列(“类型”)分成两个较小的数据框。如果“类型”为“ 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 :(得分: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}