Python: 从多个列中动态选择列值
Python: Selecting column values from multiple columns dynamically
我有 2 个数据框。第一个是摘要 table,总结了每个行业及其来源的准确性(按降序排列)。
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)
在第二个table中,Source A和B里面有字符串列表,可以是null:
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)
对于每个 row/company,我应该 select 第一个具有最高精度的非空源,它看起来像下面的 table:
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,虽然它们都来自 'chemical' 行业,但对于 company2,其来源来自来源 A,因为它在来源 B 中的值为 null。
对于 'education' 行业的 company3,即使来源 B 中有值,因为 'education' 行业的来源 B 不符合某个最低阈值(因此它没有出现在 df1) 中,它是 'source' 并且 'source_value' 应该是空的。
提前致谢!
您可以 melt
、merge
和过滤器:
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 NaN
我有 2 个数据框。第一个是摘要 table,总结了每个行业及其来源的准确性(按降序排列)。
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)
在第二个table中,Source A和B里面有字符串列表,可以是null:
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)
对于每个 row/company,我应该 select 第一个具有最高精度的非空源,它看起来像下面的 table:
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,虽然它们都来自 'chemical' 行业,但对于 company2,其来源来自来源 A,因为它在来源 B 中的值为 null。
对于 'education' 行业的 company3,即使来源 B 中有值,因为 'education' 行业的来源 B 不符合某个最低阈值(因此它没有出现在 df1) 中,它是 'source' 并且 'source_value' 应该是空的。
提前致谢!
您可以 melt
、merge
和过滤器:
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 NaN