我正在使用Python 3和pandas。有两个数据帧。
例如,第一个:
Key Sample
0 A Sa
1 B Sb
2 A Sc
... ... ...
第二个:
Key Sample
0 A Se
1 A Sa
2 B Sg
... ... ...
如何使用pandas库生成下表:
Key Rate_first Rate_second
0 A 1.00 0.92
1 B 1.00 1.00
2 С 0.95 0.60
... ... ... ...
其中Rate_first(对于key =='A')= #unique samples with key =='A'来自第一个数据帧 / #union(样本带键=='A'来自第一个数据帧和第二个数据帧)。
Rate_second - 类似。
P.S。:猜猜需要使用groupby函数,但由于缺乏经验,不明白如何将它应用于我的问题。
答案 0 :(得分:1)
根据我们的讨论,这也很容易做到。试试这个:
In []: df_merged = pd.concat([df1, df2], axis=0)
df_total = pd.concat([df1.groupby('key')['Sample'].count(),
df2.groupby('key')['Sample'].count(),
df_merged.groupby('key')['Sample'].unique().apply(len)],
axis=1, ignore_index=True)
df_total.columns = ['Sample1_Count', 'Sample2_Count', 'Union_Count']
df_total
Out[]: Sample1_Count Sample2_Count Union_Count
key
A 4 3 4
B 1 1 1
In []: df_total['Rate_first'] = df_total['Sample1_Count']/df_total['Union_Count']
df_total['Rate_second'] = df_total['Sample2_Count']/df_total['Union_Count']
df_total
Out[]: Sample1_Count Sample2_Count Union_Count Rate_first Rate_second
key
A 4 3 4 1.0 0.75
B 1 1 1 1.0 1.0
下面的旧答案
如果我理解正确,您希望计算每个DataFrame的总份额。试试这个:
In []: df_total = pd.merge(df1.groupby('key')['Sample'].count(),
df2.groupby('key')['Sample'].count(),
suffixes=('_1', '_2'))
df_total
Out[]: Sample_1 Sample_2
key
A 2 2
B 1 1
In []: df_total['Rate_first'] = df_total['Sample_1']/(df_total['Sample_1'] + df_total['Sample_2'])
df_total['Rate_second'] = df_total['Sample_2']/(df_total['Sample_1'] + df_total['Sample_2'])
df_total
Out[]: Sample_1 Sample_2 Rate_first Rate_second
key
A 2 2 0.5 0.5
B 1 1 0.5 0.5
如果这不是您想要的,那么您需要更好地构建问题。我根据你的问题理解我的最佳状态。