【问题标题】:pandas vlookup based on conditionspandas vlookup 基于条件
【发布时间】:2019-02-05 07:39:31
【问题描述】:

我有两个数据框,如下所示:

df1:

Cell    NodeName        conc        Delta
S1C1    B4MU1241    B4MU1241;S1C1   0.2
S2C1    B4MU1241    B4MU1241;S2C1   0.2
S3C1    B4MU1241    B4MU1241;S3C1   1
S4C1    B4MU1241    B4MU1241;S4C1   11.1
S1C1    B4MU1702    B4MU1702;S1C1   0.2
S1C2    B4MU1702    B4MU1702;S1C2   0.2
S2C1    B4MU1702    B4MU1702;S2C1   0.1
S2C2    B4MU1702    B4MU1702;S2C2   0
S3C1    B4MU1702    B4MU1702;S3C1   0.1
S3C2    B4MU1702    B4MU1702;S3C2   0.2
S4C1    B4MU1702    B4MU1702;S4C1   0.1
S4C2    B4MU1702    B4MU1702;S4C2   0.1

df2:

Cell        NodeName      conc       Temparature-DUW    Delta
S1C1;       B4MU1241    B4MU1241;S1C1       60C 
S2C1;       B4MU1241    B4MU1241;S2C1       60C 
S3C1;       B4MU1241    B4MU1241;S3C1       60C 
S4C1;       B4MU1241    B4MU1241;S4C1       60C 
S1C1;S1C2;  B4MU1702    B4MU1702;S1C1;S1C2  56C 
S2C1;S2C2;  B4MU1702    B4MU1702;S2C1;S2C2  56C 
S3C1;S3C2;  B4MU1702    B4MU1702;S3C1;S3C2  56C 
S4C1;S4C2;  B4MU1702    B4MU1702;S4C1;S4C2  56C 

现在我想在 df2 中填写“Delta”列,这样输出应该是:

Cell            NodeName    conc        Temparature-DUW Delta
S1C1;       B4MU1241    B4MU1241;S1C1       60C          0.2
S2C1;       B4MU1241    B4MU1241;S2C1       60C          0.2
S3C1;       B4MU1241    B4MU1241;S3C1       60C           1
S4C1;       B4MU1241    B4MU1241;S4C1       60C          11.1
S1C1;S1C2;  B4MU1702    B4MU1702;S1C1;S1C2  56C          0.2, 0.2
S2C1;S2C2;  B4MU1702    B4MU1702;S2C1;S2C2  56C           0.1,0
S3C1;S3C2;  B4MU1702    B4MU1702;S3C1;S3C2  56C          0.1,0.2
S4C1;S4C2;  B4MU1702    B4MU1702;S4C1;S4C2  56C          0.1,0.1

我尝试过这样的事情:

df1.loc[df1.apply(lambda row: row.conc in [df2.conc.values], axis=1),
   df1['Delta']] = df1['Delta']+df2['Delta']

它给了我错误

ValueError: ('一个多元素数组的真值不明确。使用 a.any() 或 a.all()', '发生在索引 0')

【问题讨论】:

  • 请将代码格式化为可读
  • 是的,我已经编辑了@SpghttCd
  • 抱歉,但没有人有时间或愿意重新创建您的要求为什么或更好:由于什么逻辑应该从您的列表中插入列Delta中的那些值.你可能很清楚 - 所以请:写下来。

标签: python pandas


【解决方案1】:

这是另一种方法:

mapping = df1[['conc', 'Delta']].set_index('conc')['Delta'].to_dict()

df2['Delta'] = df2['conc'].apply(lambda x: [mapping[';'.join((x.split(';')[0], i))] for i in x.split(';')[1:]])

df2
#         Cell  NodeName Temparature-DUW                conc       Delta
#0       S1C1;  B4MU1241             60C       B4MU1241;S1C1       [0.2]
#1       S2C1;  B4MU1241             60C       B4MU1241;S2C1       [0.2]
#2       S3C1;  B4MU1241             60C       B4MU1241;S3C1       [1.0]
#3       S4C1;  B4MU1241             60C       B4MU1241;S4C1      [11.1]
#4  S1C1;S1C2;  B4MU1702             56C  B4MU1702;S1C1;S1C2  [0.2, 0.2]
#5  S2C1;S2C2;  B4MU1702             56C  B4MU1702;S2C1;S2C2  [0.1, 0.0]
#6  S3C1;S3C2;  B4MU1702             56C  B4MU1702;S3C1;S3C2  [0.1, 0.2]
#7  S4C1;S4C2;  B4MU1702             56C  B4MU1702;S4C1;S4C2  [0.1, 0.1]

【讨论】:

  • 这和我的不一样吗?)。除了你因为某种原因被; 分割了两次。并将生成器表达式提供给str.join,这与列表理解相比效率低下。
【解决方案2】:

您可以通过set_index 创建映射系列,然后通过pd.Series.apply 使用自定义函数。这效率不高,但也不能保存表示数字数据的逗号分隔字符串。

请注意,f-strings 需要 Python 3.6+,如有必要,您可以使用 str.format

d = df1.set_index('conc')['Delta'].to_dict()

def get_vals(x):
    pre, *post = x.split(';')
    return ', '.join([str(d[f'{pre};{suffix}']) for suffix in post])

df2['Delta'] = df2['conc'].apply(get_vals)

print(df2[['conc', 'Delta']])

                 conc     Delta
0       B4MU1241;S1C1       0.2
1       B4MU1241;S2C1       0.2
2       B4MU1241;S3C1       1.0
3       B4MU1241;S4C1      11.1
4  B4MU1702;S1C1;S1C2  0.2, 0.2
5  B4MU1702;S2C1;S2C2  0.1, 0.0
6  B4MU1702;S3C1;S3C2  0.1, 0.2
7  B4MU1702;S4C1;S4C2  0.1, 0.1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多