如何在pandas中编写一个高效的多条件搜索函数?
How to write an efficient multiple criteria search function in pandas?
我有一个这样的数据框。
我想在 zip
和 div
列中搜索并获得 type
并将该结果应用于所有唯一的 zip。一种枢轴函数,但 return 实际值而不是聚合函数。(假设只有 zip
和 div
的一种组合)
df1 = pd.DataFrame(list(product(list(range(100,200)), ['A','B','C','D','E'])), columns=['zip', 'div'])
df1 = df1.drop(df1.index[np.random.randint(0,499,size=100)]).reset_index()
df1['type'] = np.random.choice(['P','Q','R'],size=df1.shape[0])
我试过 apply/lambda 功能,但速度很慢。我的数据在 df1 中包含 500K 行,其中 41K 个唯一 zip
s 和 15 个唯一 div
s
有没有一种有效的方法可以得到如下结果。
df2 = pd.DataFrame({'zip':[100,101],'A':['Q','P'],'B':['Q','Q'],'C':['Q','P'],'D':['Q','R'],'E':['Q','P']})
假设 zip 是非数字的。
试试:
m=df.groupby('zip')['type'].apply(list)
n=pd.DataFrame(m.values.tolist(),columns=df['div'].unique(),index=m.index)
print(n)
A B C D E
zip
100 Q Q Q Q Q
101 P Q P R P
P.S 您不应该将 div
作为列,因为这是一个 pandas 函数(我建议您将其更改为 div)
以外的其他内容
另一种解决方案,如果您想使用枢轴table:
df_pivot=df.pivot_table(index='zip',columns=['div'],aggfunc='first')
我有一个这样的数据框。
我想在 zip
和 div
列中搜索并获得 type
并将该结果应用于所有唯一的 zip。一种枢轴函数,但 return 实际值而不是聚合函数。(假设只有 zip
和 div
的一种组合)
df1 = pd.DataFrame(list(product(list(range(100,200)), ['A','B','C','D','E'])), columns=['zip', 'div'])
df1 = df1.drop(df1.index[np.random.randint(0,499,size=100)]).reset_index()
df1['type'] = np.random.choice(['P','Q','R'],size=df1.shape[0])
我试过 apply/lambda 功能,但速度很慢。我的数据在 df1 中包含 500K 行,其中 41K 个唯一 zip
s 和 15 个唯一 div
s
有没有一种有效的方法可以得到如下结果。
df2 = pd.DataFrame({'zip':[100,101],'A':['Q','P'],'B':['Q','Q'],'C':['Q','P'],'D':['Q','R'],'E':['Q','P']})
假设 zip 是非数字的。
试试:
m=df.groupby('zip')['type'].apply(list)
n=pd.DataFrame(m.values.tolist(),columns=df['div'].unique(),index=m.index)
print(n)
A B C D E
zip
100 Q Q Q Q Q
101 P Q P R P
P.S 您不应该将 div
作为列,因为这是一个 pandas 函数(我建议您将其更改为 div)
另一种解决方案,如果您想使用枢轴table:
df_pivot=df.pivot_table(index='zip',columns=['div'],aggfunc='first')