首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:动态地从多列中选择列值

Python:动态地从多列中选择列值
EN

Stack Overflow用户
提问于 2022-04-12 12:00:00
回答 1查看 63关注 0票数 1

我有两个数据。第一个是一个汇总表,它总结了每个行业及其来源的准确性(按降序排列)。

代码语言:javascript
复制
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中有字符串列表,它们可以是空的:

代码语言:javascript
复制
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)

对于每一行/公司,我应该选择具有最高精度的第一个非空源,它将类似于下表:

代码语言:javascript
复制
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”应该是空的。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-12 13:30:23

您可以使用meltmerge和filter:

代码语言:javascript
复制
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'])
)

产出:

代码语言:javascript
复制
    company   industry  source_value which_source
0  company1   chemical  [a123, b456]     source B
1  company2   chemical  [a555, d333]     source A
2  company3  education          None          NaN
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71842302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档