簡體   English   中英

Python:動態地從多列中選擇列值

[英]Python: Selecting column values from multiple columns dynamically

我有 2 個數據框。 第一個是匯總表,匯總了每個行業及其來源的准確性(按降序排列)。

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)

在第二張表中,Source 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)

對於每一行/公司,我應該 select 第一個具有最高精度的非空源,如下表所示:

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 中的值為 null。

對於來自“教育”行業的 company3,即使源 B 中有一個值,因為“教育”行業的源 B 不滿足某個最低閾值(因此它沒有出現在 df1 中),它是“源”而“source_value”應該只是 null。

提前致謝!

你可以meltmerge和 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'])
)

output:

    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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM