分组数据帧后的比较集(Python 3,pandas)

时间:2015-12-05 07:00:31

标签: python-3.x pandas

我正在使用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函数,但由于缺乏经验,不明白如何将它应用于我的问题。

1 个答案:

答案 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

如果这不是您想要的,那么您需要更好地构建问题。我根据你的问题理解我的最佳状态。