假设我有以下数据框:
import pandas as pd
df = pd.DataFrame(['a', 'b', 'c', 'd', 'a', 'c', 'f', 'a'])
print(df)
我可以替换任何' a'与AAA'如下:
df.columns = ['Letters']
for i, x in enumerate(df['Letters']):
if x == 'a':
df['Letters'][i] = "AAA"
print(df)
但是如果我提取了唯一的行并尝试做同样的事情,它就不起作用了。
df = pd.DataFrame(['a', 'b', 'c', 'd', 'a', 'c', 'f', 'a'])
df.columns = ['Letters']
grouped = df.groupby('Letters')
index = [gp_keys[0] for gp_keys in grouped.groups.values()]
unique_df = df.reindex(index)
print(unique_df)
for i, x in enumerate(unique_df):
if x == 'a':
unique_df.loc[i] = "AAA"
print(unique_df)
我很好奇为什么unique_df[i] = "AAA"
不再修改数据帧值。即使按照视图与复制帖here中的建议进行unique_df.loc[i] = "AAA"
似乎没有任何区别。似乎有一些关于groupby
函数的东西使得后来对数据框的修改变得难以捉摸。有什么想法吗?
答案 0 :(得分:1)
可能没有完全回答这个问题,因为你提供的例子可以简化,但在这种情况下你真的不应该列举。
如果要根据条件修改某些值,可以使用布尔索引,如:
df.loc[df['Letters']=='a', 'Letters'] = "AAA"
而不是做for循环。
原始问题的答案:您需要在第二个示例中使用unique_df['Letters']
而不是unique_df
(正如您在第一个示例中所做的那样)。
答案 1 :(得分:0)
你可以尝试一下
S = unique_df['Letters']
for i, x in enumerate(S):
if x == 'a':
unique_df['Letters'][i] = "AAA"
# unique_df.loc[i] = "AAA" -- this will work too
print(unique_df)
或者,您可以使用unique_df.values
for i, x in enumerate(unique_df.values):
if x == 'a':
unique_df['Letters'][i] = "AAA"
# unique_df.loc[i] = "AAA" -- this will work too
print(unique_df)