Pandas数据帧,一个复杂功能的智能应用到groupby resu

2024-04-26 05:57:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas.DataFrame,有3列str和{}其他的float64类型的列。在

我需要按三个str列中的一个对行进行分组,并应用一个函数myComplexFunc(),该函数将把̀N行减少为一行。在

myComplexFunc()只取float64类型的行。在

这可以用一些for循环来完成,但效率不高,所以我尝试使用pandasflexible apply,但它似乎运行了myComplexFunc()的重代码两次!在

更清楚地说,这里是一个最小的例子

让“df”成为这样的数据帧: 在

df
>>
     A      B         C         D
0  foo    one  0.406157  0.735223
1  bar    one  1.020493 -1.167256
2  foo    two -0.314192 -0.883087
3  bar  three  0.271705 -0.215049
4  foo    two  0.535290  0.185872
5  bar    two  0.178926 -0.459890
6  foo    one -1.939673 -0.523396
7  foo  three -2.125591 -0.689809

myComplexFunc()

^{pr2}$

我想要的:

# wanted apply is the name of the wanted method
df.groupby("A").wanted_apply(myComplexFunc)

>> 
    A    C            D
0  foo   new_c0_foo   new_d0_foo
1  bar   new_c0_bar   new_d0_bar

B已被删除,因为它不是float64类型。在

提前谢谢


Tags: 函数类型pandasdfnewfoobarone
1条回答
网友
1楼 · 发布于 2024-04-26 05:57:00

您可以按dtype^{}过滤数据帧,但需要按Seriesdf.A进行聚合:

def myComplexFunc(rows):
    return rows  + 10

df = df.select_dtypes(include=[np.float64]).groupby([df.A]).apply(myComplexFunc)
print (df)
           C          D
0  10.406157  10.735223
1  11.020493   8.832744
2   9.685808   9.116913
3  10.271705   9.784951
4  10.535290  10.185872
5  10.178926   9.540110
6   8.060327   9.476604
7   7.874409   9.310191

因为如果只使用A

^{pr2}$

得到

KeyError: 'A'

它是正确的-所有字符串列都被排除(AB)。在

print (df.select_dtypes(include=[np.float64]))
          C         D
0  0.406157  0.735223
1  1.020493 -1.167256
2 -0.314192 -0.883087
3  0.271705 -0.215049
4  0.535290  0.185872
5  0.178926 -0.459890
6 -1.939673 -0.523396
7 -2.125591 -0.689809

相关问题 更多 >