【问题标题】:Conditional calculation on different sized dataframes in PythonPython中不同大小数据帧的条件计算
【发布时间】:2020-11-23 01:08:41
【问题描述】:

我正在使用纬度/经度/值格式的两个数据框 df1df2

    print(df1)
    0    1    2
0  -85 -175  1.8
1  -80 -170  1.6
..   

    print(df2)
    0    1    2
0 -70 -150  2.5
1 -80 -170  2.0
2 -85 -175  3.0
..

我想乘以df1[2] by df2[2] if df1[0] = df2[0] and df1[1] = [1]。我尝试使用以下内容:

df1['multiplied']=np.where((df1[0]==df2[0],df1[2]*df2[2],np.nan) #if column 1 of df1 equals column 1 
                                                                     #of df2, multiply. Else give NaN

我知道我忽略了此示例中的第二个条件。这里的缺点是,列值的比较是按元素进行的(我的纬度/经度数据未排序)。不同的df大小也会导致错误“只能比较标签相同的系列对象”

在另一种方法中,我尝试检查df1[0]df2[0] 是否相同,并给出一个符合条件的新df:

dfnew=df1.loc[df1[0]==df2[0]]

这导致我出现与上述相同的错误。

我想知道您是否对如何对不同大小的未排序数据框应用条件计算有任何建议?

【问题讨论】:

  • df3=df1.merge(df2, on= [0,1], how='inner') ... df3['2_x'].mul(df3['2_y'])

标签: python pandas numpy dataframe conditional-statements


【解决方案1】:
  1. 在相同的经纬度上合并您的数据框。注意,“inner”只保留键的交集:

    df3 = df1.merge(df2, on = [0,1], how = 'inner')

  2. 将 long/lats 与自己相乘:

    df3['multiplied_long'] = df3.0**2

    df3['multiplied_lat'] = df3.1**2

【讨论】:

    【解决方案2】:

    如果您希望数据框仅包含匹配的行:

    merged = df1.merge(df2,on=[0,1])
    merged[2] = merged['2_x'] * merged['2_y']
    merged = merged.drop(['2_x', '2_y'], axis=1)
    

    输出:

        0    1    2
    0 -85 -175  5.4
    1 -80 -170  3.2
    

    如果您希望它包含来自df2 的所有行(显然,您可以将其更改为包含df1 的所有行或两者都包含)并将不匹配的行设置为NaN

    merged = df1.merge(df2,on=[0,1],how='right')
    merged[2] = merged['2_x'] * merged['2_y']
    merged = merged.drop(['2_x', '2_y'], axis=1)
    

    输出:

        0    1    2
    0 -70 -150  NaN
    1 -80 -170  3.2
    2 -85 -175  5.4
    

    【讨论】:

      猜你喜欢
      • 2018-07-12
      • 2021-09-24
      • 2020-05-21
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多