【问题标题】:Set Pandas Value Based on Dictionary根据字典设置 Pandas 值
【发布时间】:2017-09-16 04:03:34
【问题描述】:

我想用 A 字典中的值替换 Dataframe 的值。 简而言之:如果 Column C 中有一个与字典键匹配的值,则将 Column D 替换为字典中与该特定键对应的值。

import pandas as pd
import numpy as np
dfp = pd.DataFrame({'A' : [np.NaN,np.NaN,3,4,5,5,3,1,5,np.NaN], 
                    'B' : [1,0,3,5,0,0,np.NaN,9,0,0], 
                    'C' : ['AA1233445','A9875', 'rmacy','Idaho Rx','Ab123455','TV192837','RX','Ohio Drugs','RX12345','USA Pharma'], 
                    'D' : [123456,123456,1234567,12345678,12345,12345,12345678,123456789,1234567,np.NaN],
                    'E' : ['Assign','Unassign','Assign','Ugly','Appreciate','Undo','Assign','Unicycle','Assign','Unicorn',]})
print(dfp)

z = {'rmacy': 999}
dfp.loc[dfp['C'].isin(z.keys()), 'D' ] = z.values() # <--- code to change

Output: 
     A    B           C            D           E
0  NaN  1.0   AA1233445       123456      Assign
1  NaN  0.0       A9875       123456    Unassign
2  3.0  3.0       rmacy        (999)      Assign #<--- Worked with paranthesis
3  4.0  5.0    Idaho Rx  1.23457e+07        Ugly
4  5.0  0.0    Ab123455        12345  Appreciate
5  5.0  0.0    TV192837        12345        Undo
6  3.0  NaN          RX  1.23457e+07      Assign
7  1.0  9.0  Ohio Drugs  1.23457e+08    Unicycle
8  5.0  0.0     RX12345  1.23457e+06      Assign
9  NaN  0.0  USA Pharma          NaN     Unicorn

上面的代码有效(除了将值放在Paranthesis中。但是如果字典大于一个键,它将把两个值都放在Column D中,因为列中有两个匹配项。

     A    B           C            D           E
0  NaN  1.0   AA1233445       123456      Assign
1  NaN  0.0       A9875       123456    Unassign
2  3.0  3.0       rmacy   (999, 333)      Assign
3  4.0  5.0    Idaho Rx  1.23457e+07        Ugly
4  5.0  0.0    Ab123455        12345  Appreciate
5  5.0  0.0    TV192837        12345        Undo
6  3.0  NaN          RX   (999, 333)      Assign
7  1.0  9.0  Ohio Drugs  1.23457e+08    Unicycle
8  5.0  0.0     RX12345  1.23457e+06      Assign
9  NaN  0.0  USA Pharma          NaN     Unicorn

如何解决这个问题?

【问题讨论】:

    标签: python pandas dictionary dataframe


    【解决方案1】:

    使用mapfillna

    dfp.assign(D=dfp.C.map(z).fillna(dfp.D))
    
         A    B           C            D           E
    0  NaN  1.0   AA1233445     123456.0      Assign
    1  NaN  0.0       A9875     123456.0    Unassign
    2  3.0  3.0       rmacy        999.0      Assign
    3  4.0  5.0    Idaho Rx   12345678.0        Ugly
    4  5.0  0.0    Ab123455      12345.0  Appreciate
    5  5.0  0.0    TV192837      12345.0        Undo
    6  3.0  NaN          RX   12345678.0      Assign
    7  1.0  9.0  Ohio Drugs  123456789.0    Unicycle
    8  5.0  0.0     RX12345    1234567.0      Assign
    9  NaN  0.0  USA Pharma          NaN     Unicorn
    

    【讨论】:

    • 你总是给出正确答案!哈哈。你能引导我完成方法吗?如何使用 fillna() 给出正确的结果让我大吃一惊。
    • @MattR map 如果字典中有一个值,则返回该值,否则返回NaN。然后我用fillna(df.D) 填充那些NaN。然后我用这些新值覆盖当前的df.D
    • 简直太棒了......我希望有一天我能像你一样流利。干杯!
    • 您刚刚启发了我阅读一些文档,而我刚刚想出了另一个答案。 dfp.loc[(dfp['C'].isin([x[0] for x in z.items()])), 'D'] = [x[1] for x in z.items()] 如何比较。您认为这是一个可行的选择吗?
    • @MattR 不,那行不通。 (dfp['C'].isin([x[0] for x in z.items()])) 检查 z 的密钥中的成员资格......这很好。你指向'D'...这也很好。但是您分配的值列表的长度可能与键中具有'C' 值的行数的长度不同......(头晕目眩)。
    猜你喜欢
    • 2017-04-10
    • 2020-10-24
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2015-10-30
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多