【问题标题】:pandas how to divide to get ratio for different two dataframe熊猫如何划分以获得不同两个数据帧的比率
【发布时间】:2019-12-11 15:09:32
【问题描述】:

df1 是参考,df2 是目标。 df2 的 TYPE 列值应该被忽略,只是保持值不变.. 由于 df2 中的 TYPE 列,我无法直接划分。 如何比较两个数据帧并从参考数据帧中获取比率。 我必须保留 df2 数据框,并且只更新“总和”的比率值。

python

 import numpy as np
 import pandas as pd
 df_data = {}
 df_data['ID'] = [100001,100002,100003,100004]
 df_data['ID2'] = ['A','B','C','D']
 df_data['sum'] = [7,8,4,5]
 df = pd.DataFrame(df_data)
 print(df)

 df_data2= {}
 df_data2['ID'] = [100001,100002,100002,100003,100003,100001,100002]
 df_data2['ID2'] = ['G','H','Q','J','H','A','B']
 df_data2['TYPE'] = ['A','A','B','A','B','C','E']
 df_data2['sum'] = [14,4,4,2,8,100,10]
 df2 = pd.DataFrame(df_data2)
 print(df2)

 # my trying. I can get value but df2's dataframe is broken. I can't find value for TYPE column..
 df.set_index(['ID','ID2'])['sum'] / df.set_index(['ID','ID2'])['sum']
#printout df
       ID ID2  sum
0  100001   A    7
1  100002   B    8
2  100003   C    4
3  100004   D    5
#print df2
       ID ID2 TYPE  sum
0  100001   G    A   14
1  100002   H    A    4
2  100002   Q    B    4
3  100003   J    A    2
4  100003   H    B    8
5  100001   A    C  100
6  100002   B    E   10

# my goal
       ID ID2 TYPE  sum
0  100001   G    A   N/A  # There is no value ( ID:100001 ID2:G)
1  100002   H    A   N/A  # There is no value ( ID:100002 ID2:H)
2  100002   Q    B   N/A  # There is no value ( ID:100002 ID2:Q)
3  100003   J    A   N/A
4  100003   H    B   N/A
5  100001   A    C   25.0  # There is value ( ID:100001 ID2:A)
6  100002   B    E   2.0   # There is value ( ID:100002 ID2:B)

#my trying
ID      ID2
100001  A      14.285714
        G            NaN
100002  B       1.250000
        H            NaN
        Q            NaN
100003  C            NaN
        H            NaN
        J            NaN
100004  D            NaN

【问题讨论】:

  • 为什么100001, A 在预期输出中有25.0?
  • 抱歉应该是 100/7 而不是 25.0
  • 看看我的回答有没有帮助?
  • 是的,非常感谢 :)

标签: python pandas


【解决方案1】:

这可以是merge:

df2['sum'] = (df2.merge(df, on=['ID','ID2'],
                        how='left')
                 .assign(sum=lambda x: x.sum_x/x.sum_y)
                 ['sum']
             )

输出:

       ID ID2 TYPE        sum
0  100001   G    A        NaN
1  100002   H    A        NaN
2  100002   Q    B        NaN
3  100003   J    A        NaN
4  100003   H    B        NaN
5  100001   A    C  14.285714
6  100002   B    E   1.250000

【讨论】:

    猜你喜欢
    • 2019-06-29
    • 2018-02-15
    • 2020-05-05
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 2020-11-16
    相关资源
    最近更新 更多