我有两个非常大的熊猫数据框,df
和df_new
示例df
:
A B DU DR
100 103 -2 -10
100 110 -8 -9
100 112 0 -4
100 105 2 0
100 111 NAN 12
.
.
.
264 100 NAN -15
.
.
.
示例df_new
:
A TD
100 0
100 1
100 2
.
.
.
103 0
103 1
.
.
.
对于相同的{{1},我希望获得另一个B
的熊猫数据帧,其DU
小于或等于TD
的{{1}} df_new
和A
中的}。类似地,对于df
的相同值,我需要df_new
的计数,其中B
大于DU
的{{1}}(对于相同的TD
(它还应包括{ {1}})。
即:
我期望的数据框应该是这样的:
df_new
如何在Python中执行此操作?
请注意,数据量巨大。
答案 0 :(得分:2)
首先将DataFrame.merge
与左连接一起用于一个Dataframe,然后将Series.gt
的列与center
进行比较,并
将>
的{{3}}移到包含Series.le
的新列中,最后汇总为<=
:
sum
另一种具有自定义功能的解决方案,但如果使用大型DataFrame df1 = df_new.merge(df.assign(DU = df['DU'].fillna(df_new['TD'].max() + 1)), on='A', how='left')
df2 = (df1.assign(Count_Less=df1['DU'].le(df1['TD']).astype(int),
Count_More=(df1['DU'].gt(df1['TD'])).astype(int))
.groupby(['A','TD'], as_index=False)['Count_Less','Count_More'].sum()
)
print (df2)
A TD Count_Less Count_More
0 100 0 3 2
1 100 1 3 2
2 100 2 4 1
3 103 0 0 0
4 103 1 0 0
,则速度较慢:
df_new