2014-12-24 3 views
1

Предполагая, что я имею следующий кадр данных:модифицирующие значения в панд dataframe

import pandas as pd 
df = pd.DataFrame(['a', 'b', 'c', 'd', 'a', 'c', 'f', 'a']) 
print(df) 

можно заменить любое вхождение «а» с «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" больше не изменяет значения кадров данных. Даже делая unique_df.loc[i] = "AAA", как было предложено в представлении против копии сообщения here, похоже, не имеет значения. Кажется, что-то есть в функции groupby, которая делает последующую модификацию в кадре данных неуловимой. Есть предположения?

+2

В обоих случаях вы используете две разные вещи: 'df ['Letters']' vs 'unique_df' в итерации/присваивании. Поэтому во втором случае он пытается установить столбец 'i'th (это« Письма », а не« Первый »). Если вы замените 'unique_df' на' unique_df ['Letters'] ', это сработает. Но в любом случае вам лучше просто «df.loc [df ['Letters'] == 'a', 'Letters'] =" AAA "' вместо цикла for. – joris

+0

unique_df.loc [i] = "AAA" отлично работает – aerokite

+0

@AerofoilKite Уверен, что я запускаю следующее и не меняет значение: 'для i, x в enumerate (unique_df): if x == 'a ': unique_df.loc [i] = "AAA" print (unique_df) ' – sedeh

ответ

1

Это, возможно, не в полной мере отвечая на вопрос, как, например, вы, может быть упрощена, но вы действительно не следует перечислять в таком случае.
Если вы хотите изменить некоторые значения на основе условий, вы можете использовать логическое индексирование как:

df.loc[df['Letters']=='a', 'Letters'] = "AAA" 

вместо того, чтобы делать цикл.


Ответ оригинальный вопрос: вам нужно использовать unique_df['Letters'] вместо unique_df в вашем втором примере (как вы делали это в первом примере).

+0

Отлично. Предполагая, что я хочу заменить более одного значения, есть способ сделать это одним махом вместо поэтапного, как показано ниже: 'unique_df.loc [unique_df ['Letters'] == 'a', 'Letters'] = "AAA" unique_df.loc [unique_df ['Письма'] == 'c', 'Письма'] = "CCC" ' – sedeh

+0

В такой случай, вы также можете сделать что-то вроде '' unique_df ['Letters']. replace (['a', 'c'], ['AAA', 'CCC']) '' – joris

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) 
+0

Нет необходимости преобразовывать его в серию, 'unique_df ['Letters']' уже есть серия , Также не нужно использовать 'values', просто перечислите' unique_df ['Letters'] 'или лучше: не перечислите вообще. – joris

Смежные вопросы