我有如下所示的数据框,并希望通过熊猫中的“ apply method”使用以下def来更改以下结果df。
据我所知,“套用”方法使一系列内容不替换原始df。
id a b
-------
a 1 4
b 2 5
c 6 2
if df['a'] > df['b'] :
df['a'] = df['b']
else :
df['b'] = df['a']
result df :
id a b
-------
a 4 4
b 5 5
c 6 6
答案 0 :(得分:2)
我不确定您需要什么,因为期望的输出与您的条件不同,所以在这里我只能修复您的代码
for x,y in df.iterrows():
if y['a'] > y['b']:
df.loc[x,'a'] = df.loc[x,'b']
else:
df.loc[x,'b'] = df.loc[x,'a']
df
Out[40]:
id a b
0 a 1 1
1 b 2 2
2 c 2 2
如果我正确理解了您的问题
df.assign(**dict.fromkeys(['a','b'],np.where(df.a>df.b,df.a,df.b)))
Out[43]:
id a b
0 a 1 1
1 b 2 2
2 c 2 2
答案 1 :(得分:1)
和其余的一样,不是完全确定您要做什么,我要去ASSUME是指将整个当前“ A”或“ B”值的值设置为等于最高值该行中任一列的值。...如果该假设正确,则可以使用“ .apply()”进行此操作。
第一件事,是“ .apply()”的大多数“干净”应用程序(记住,通常不建议使用“ .apply()”的应用程序)利用一种函数来获取行输入,该行由“ .apply()”函数,通常返回相同的对象,但根据需要进行修改/更改/等。考虑到您的数据框,此函数可实现所需的输出,然后使用“ .apply()”对数据框应用该函数。
# Create the function to be used within .apply()
def comparer(row):
if row["a"] > row["b"]:
row["b"] = row["a"]
elif row["b"] > row["a"]:
row["a"] = row["b"]
return(row)
# Use .apply() to execute our function against our column values. Returning the result of .apply(), re-creating the "df" object as our new modified dataframe.
df = df.apply(comparer, axis=1)
大多数人(如果不是所有人)似乎都反对使用“ .apply()”。我可能会注意他们的智慧:)
答案 2 :(得分:0)
尝试:
df = pd.DataFrame({'a': [1, 2, 6], 'b': [4,5,2]})
df['a'] = df.max(axis=1)
df['b'] = df['a']