我有两个数据。第一个是一个汇总表,它总结了每个行业及其来源的准确性(按降序排列)。
cols = ['industry', 'source', 'accuracy']
df = pd.DataFrame(np.array([
['chemical', 'source B', 0.9],
['chemical', 'source A', 0.7],
['education', 'source A', 0.9],
]), columns=cols)在第二个表中,源A和B中有字符串列表,它们可以是空的:
cols = ['company', 'industry', 'source A', 'source B']
df2 = pd.DataFrame(np.array([
['company1', 'chemical', np.nan, ['a123', 'b456']],
['company2', 'chemical', ['a555', 'd333'], np.nan],
['company3', 'education', np.nan, ['777', '888']],
]), columns=cols)对于每一行/公司,我应该选择具有最高精度的第一个非空源,它将类似于下表:
cols = ['company', 'industry', 'which_source', 'source_value']
df3 = pd.DataFrame(np.array([
['company1', 'chemical', 'source B', ['a123', 'b456']],
['company2', 'chemical', 'source A', ['a555', 'd333']],
['company3', 'education', np.nan, np.nan],
]), columns=cols)例如,对于company1和2,虽然它们都来自“化学”行业,但是对于company2,它的源来自于源A,因为它在源B中的值是空的。
而对于“教育”行业的company3来说,即使源B中有一个值,因为“教育”行业的源B不满足某些最低门槛(因此它没有出现在df1中),它的“源”和“source_value”应该是空的。
提前感谢!
发布于 2022-04-12 13:30:23
您可以使用melt、merge和filter:
df3 = (df2
.melt(['company', 'industry'], var_name='source', value_name='source_value')
.merge(df, how='inner')
.sort_values(by='source_value', key=pd.isna)
.groupby(['company', 'industry'], as_index=False).first()
.assign(which_source=lambda d: d['source'].mask(d['source_value'].isna()))
.drop(columns=['source', 'accuracy'])
)产出:
company industry source_value which_source
0 company1 chemical [a123, b456] source B
1 company2 chemical [a555, d333] source A
2 company3 education None NaNhttps://stackoverflow.com/questions/71842302
复制相似问题