Предполагая, что я имею следующий кадр данных:модифицирующие значения в панд 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
, которая делает последующую модификацию в кадре данных неуловимой. Есть предположения?
В обоих случаях вы используете две разные вещи: 'df ['Letters']' vs 'unique_df' в итерации/присваивании. Поэтому во втором случае он пытается установить столбец 'i'th (это« Письма », а не« Первый »). Если вы замените 'unique_df' на' unique_df ['Letters'] ', это сработает. Но в любом случае вам лучше просто «df.loc [df ['Letters'] == 'a', 'Letters'] =" AAA "' вместо цикла for. – joris
unique_df.loc [i] = "AAA" отлично работает – aerokite
@AerofoilKite Уверен, что я запускаю следующее и не меняет значение: 'для i, x в enumerate (unique_df): if x == 'a ': unique_df.loc [i] = "AAA" print (unique_df) ' – sedeh