【问题标题】:Python add new column values based on multiple conditions in another dataframePython根据另一个数据框中的多个条件添加新列值
【发布时间】:2020-10-07 07:31:23
【问题描述】:

我有两个数据框,

df1 = pd.DataFrame({'col_A':['AA','AA','AB','AB','AA','AA','AB','AB'],  
                   'col_B':['BB','BB','BB','BB','BC','BC','BC','BC'],  
                   'col_HIGH':[10,20,10,20,10,20,10,20],  
                   'col_LOW':[0,10.0001,0,10.0001,0,10.0001,0,10.0001],  
                   'col_D':[6,16,7,17,8,18,9,19]})  
df2 = pd.DataFrame({'ID':['01','11','21','02','12','22','03','13','23','04','14','24','05','15','25','06','16','26','07','17','27','08','18','28'],  
'col_A':['AA','AA','AA','AA','AA','AA','AB','AB','AB','AB','AB','AB','AA','AA','AA','AA','AA','AA','AB','AB','AB','AB','AB','AB'],  
'col_B':['BB','BB','BB','BB','BB','BB','BB','BB','BB','BB','BB','BB','BC','BC','BC','BC','BC','BC','BC','BC','BC','BC','BC','BC',],  
'col_C':[5,7,9,15,17,19,5,7,9,15,17,19,5,7,9,15,17,19,5,7,9,15,17,19]})

我想在df2中创建col_D,并使用df1中col_D的值根据df1和df2中col_A和col_B匹配的多个条件进行填充,df2中的col_C值在df1中col_HIGH和col_LOW的范围内。最快的方法是什么?

【问题讨论】:

  • 你能添加预期输出的例子吗?
  • 嗨弗兰基,您的问题并不明确您正在寻找什么输出。请修改和更新。
  • 感谢您的回答。我的预期输出是 Scott Boston 提供的。根据df1中col_A、col_B和col_C中的值,映射df2中的行并添加col_D中的值。

标签: python pandas numpy dataframe


【解决方案1】:

这是一种使用joinpd.IntervalIndex 的方法:

# Create a new dataframe with MultiIndex of col_A, col_B, and pd.IntervalIndex defined by
# LOW and HIGH columns
df1i = df1.set_index(['col_A', 'col_B', pd.IntervalIndex.from_arrays(df1['col_LOW'], df1['col_HIGH'], name='col_C')])

# Use join
df_out = df2.set_index(['col_A', 'col_B', 'col_C']).join(df1i).reset_index()

输出:

   col_A col_B  col_C  ID  col_HIGH  col_LOW  col_D
0     AA    BB      5  01        10   0.0000      6
1     AA    BB      7  11        10   0.0000      6
2     AA    BB      9  21        10   0.0000      6
3     AA    BB     15  02        20  10.0001     16
4     AA    BB     17  12        20  10.0001     16
5     AA    BB     19  22        20  10.0001     16
6     AB    BB      5  03        10   0.0000      7
7     AB    BB      7  13        10   0.0000      7
8     AB    BB      9  23        10   0.0000      7
9     AB    BB     15  04        20  10.0001     17
10    AB    BB     17  14        20  10.0001     17
11    AB    BB     19  24        20  10.0001     17
12    AA    BC      5  05        10   0.0000      8
13    AA    BC      7  15        10   0.0000      8
14    AA    BC      9  25        10   0.0000      8
15    AA    BC     15  06        20  10.0001     18
16    AA    BC     17  16        20  10.0001     18
17    AA    BC     19  26        20  10.0001     18
18    AB    BC      5  07        10   0.0000      9
19    AB    BC      7  17        10   0.0000      9
20    AB    BC      9  27        10   0.0000      9
21    AB    BC     15  08        20  10.0001     19
22    AB    BC     17  18        20  10.0001     19
23    AB    BC     19  28        20  10.0001     19

输出:

【讨论】:

  • 您的代码在我的小示例中运行良好。但是,当我将它用于真正的大型数据帧时,我在 df_out 上收到错误“不可排序的类型:Interval() > float()”。有什么想法吗?
  • 确保您的列是 dtype float 或 int 而不是 object/string。在您较大的数据框中,High 和 Low 列的 dtype 是什么?
  • 参见此处stackoverflow.com/a/10779212/6361531 您可能会尝试使用字符串而不是数字来创建间隔。
  • 都是float64。似乎错误是关于将间隔与浮点数进行比较。如果区间是用字符串创建的,是否有办法将其与 df2 中的 col_C 进行比较?
  • 是的。那么你可以在加入之前先将你在 Df2 中的 col_c 转换为一个数字吗?
【解决方案2】:

请尝试提供您要使用的条件。

  1. 如果它是一种映射,您需要使用字典
dictionary = {'AA': 100, 'BB': 200, 'BC': 300}
df['new_column'] = df['old_column'].map(dictionary)

注意:你也可以使用上面的.apply()

  1. 你也可以使用if/else条件
  df['new_column'] = ['value1' if x==100 else 'value2' for x in df['old column']]

【讨论】:

    猜你喜欢
    • 2019-10-14
    • 2018-12-29
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多