在数据框中搜索组合以更改单元格值

时间:2016-10-19 17:51:38

标签: python pandas

如果两列中的值组合有效,我想替换列中的值。假设我有以下DataFrame

df = pd.DataFrame([
        ['Texas 1', '111', '222', '333'],
        ['Texas 1', '444', '555', '666'],
        ['Texas 2', '777','888','999']
    ])

         0    1    2    3
0  Texas 1  111  222  333
1  Texas 1  444  555  666
2  Texas 2  777  888  999

如果我想替换column 2 column 0 = Texas 1中的值和column 2 = 222的值,我会执行以下操作:

df.ix[ (df.Column 0=='Texas 1')&(df.Column 2 =='222'),Column 2] = "Success" 

对于一些组合,它可以正常工作。我失去的部分是如何为超过300种组合做到这一点?我想也许我可以使用dict并存储密钥,这将是'Success'或其他任何值。列表可以是组合。有点像这样。

a["Success"] = [Texas 1, 222]
>>> a
{"Success": [Texas 1, 222]}

但我不确定如何在DataFrame中执行此操作。

2 个答案:

答案 0 :(得分:1)

您拥有几乎所有代码,只需创建dictionarylist并对其进行迭代即可完成。

import pandas as pd
combinations = [['key1', 'key2', 'msg']]
combinations.append(['Texas 1', '222', 'triple two'])
combinations.append(['Texas 1', '555', 'triple five'])

df = pd.DataFrame([
        ['Texas 1', '111', '222', '333'],
        ['Texas 1', '444', '555', '666'],
        ['Texas 2', '777','888','999']
    ])

for c in combinations:
    df.ix[(df[0] == c[0]) & (df[2] == c[1]), 1] = c[2]

输出:

         0            1    2    3
0  Texas 1   triple two  222  333
1  Texas 1  triple five  555  666
2  Texas 2          777  888  999

答案 1 :(得分:0)

DataFrame.apply()的大用例。 Lamda一直在运作!!

df = pd.DataFrame([
        ['Texas 1', 111, 222, 333],
        ['Texas 1', 444, 555, 666],
        ['Texas 2', 777,888,999]
    ])


val_dict = {}
# assumption
# str_like_Success : [column_0 , column_1]
val_dict["Success"] = ['Texas 1', 222]
val_dict["Failure"] = ['Texas 2', 888]

函数fill_values_from_dict将应用于每一行,其中x是行(系列),val_dict是上面创建的字典

  def fill_values_from_dict(x,val_dict):
        for key,val in val_dict.items():
            if x[0] == val[0] and x[2] == val[1]:
                x.set_value(1,key)
                return x
        return x

fill_values_from_dict应用于每一行

df1 = df.apply(lambda x : fill_values_from_dict(x,val_dict),axis=1)

输出:

   print(df1)

             0        1    2    3
    0  Texas 1  Success  222  333
    1  Texas 1      444  555  666
    2  Texas 2  Failure  888  999