修改pandas数据帧中的值

时间:2014-12-24 22:27:47

标签: python pandas

假设我有以下数据框:

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函数的东西使得后来对数据框的修改变得难以捉摸。有什么想法吗?

2 个答案:

答案 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)