如果两列中的值组合有效,我想替换列中的值。假设我有以下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
中执行此操作。
答案 0 :(得分:1)
您拥有几乎所有代码,只需创建dictionary
或list
并对其进行迭代即可完成。
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