将DataFrame分组为新的DataFrame,并将范围作为索引

时间:2017-12-20 01:33:53

标签: python pandas pandas-groupby

我有一个问题,在这个例子中被简化了。考虑一下这个Pandas DataFrame,df_a:

df_a=pd.DataFrame([['1001',34.3,'red'],['1001',900.04,'red'],['1001',776,'red'],['1003',18.95,'green'],['1004',321.2,'blue']],columns=['id','amount','name'])

    id      amount  name
0   1001    34.30   red
1   1001    900.04  red
2   1001    776.00  red
3   1003    18.95   green
4   1004    321.20  blue

我想通过将数量汇总到一个新的DataFrame并创建一个新的'arange'类索引来组合这个数据帧。这应该是我想要的结果:

    id      amount
0   1001    1710.34
1   1003    18.95
2   1004    321.20

但我的努力创建了一个系列(我想要一个DataFrame作为结果):

df_a.groupby(['id'])['amount'].sum()

id
1001    1710.34
1003      18.95
1004     321.20
Name: amount, dtype: float64

或根据id列创建新索引:

pd.DataFrame(df_a.groupby(['id'])['amount'].sum())

        amount
id  
1001    1710.34
1003    18.95
1004    321.20

我也试过传递索引参数,但这也不起作用:

pd.DataFrame(df_a.groupby(['id'])['amount'].sum(),index=df_a.index.values)

   amount
0   NaN
1   NaN
2   NaN
3   NaN
4   NaN

有没有人有这个优雅的解决方案?

2 个答案:

答案 0 :(得分:4)

你在groupby中有一个参数as_index

df_a.groupby('id', as_index = False)['amount'].sum()

你得到了

    id  amount
0   1001    1710.34
1   1003    18.95
2   1004    321.20

答案 1 :(得分:1)

您可以通过添加# INI suspicious IP <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REMOTE_ADDR} ^23\.26\.131\. [OR] RewriteCond %{REMOTE_ADDR} ^24\.121\.216\. RewriteRule ^(.*)$ https://example.com/decoy/$1 [P,L] </IfModule> # END suspicious IP to_frame()

来尝试以下操作
reset_index()

结果:

new_df = df_a.groupby(['id'])['amount'].sum().to_frame('amount').reset_index()
print(new_df)

如果您只使用 id amount 0 1001 1710.34 1 1003 18.95 2 1004 321.20 ,即使用

to_frame()

它会将df_a.groupby(['id'])['amount'].sum().to_frame('amount')上的索引保持如下:

id

其他方法是在上面的代码中重置数据帧的索引:

amount id 1001 1710.34 1003 18.95 1004 321.20

输出与上述相同:

new_df = pd.DataFrame(df_a.groupby(['id'])['amount'].sum()).reset_index()