Использование df.loc для помещения значения из другой строки - PullRequest
0 голосов
/ 04 сентября 2018

Я вытаскиваю свои волосы на этом. Помощь оценена.

У меня есть фрейм данных, который я собираю, который частично включает в себя консолидацию данных, которые находятся в нескольких строках в одну. Я пытаюсь использовать df.loc для этого:

df.loc[df['foo'] == 1, 'Output Column'] = df.loc[df['bar'] == 2, 'Desired Column']

Итак, я хочу, чтобы для любой строки, где 'foo' = 1, поищите, где 'bar' = 2, и поместите значение, которое находится в 'Желаемом столбце', в исходную строку. По сути, это объединит строки для создания более чистого вывода. В качестве игрушечного примера ...

(отредактировано, чтобы показать, где мой код работает неправильно) Вот что я хочу ... До:

idx   foo     bar    Desired Column    Output Column
0     1
1             2      Hi there!
2     1
3     6

После того, как:

idx   foo     bar    Desired Column    Output Column
0     1                                Hi there!
1             2      Hi there!    
2     1                                Hi there!
3     6

Однако вот что я на самом деле получаю: До:

idx   foo     bar    Desired Column    Output Column
0     1
1             2      Hi there!
2     1
3     6

После того, как:

idx   foo     bar    Desired Column    Output Column
0     1                                
1             2      Hi there!         Hi there!
2     1                                
3     6

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Ну, это сработало ... не уверен, что это самое питонное решение, но вот оно:

df.loc[df['foo'] == 1, 'Output Column'] = df.loc[df['bar'] == 2, 'Desired Column']
df['Output Column'] = df.groupby(['foo'])['Output Column'].transform(max)

В моем игрушечном примере это заполнено единственным числом, которое соответствует bar = 2

0 голосов
/ 04 сентября 2018

Попробуйте использовать where:

df['Output Column']=df['Output Column'].where(df['bar']==2,'Hi There!')
print(df)

Выход:

    idx   foo     bar    Desired Column    Output Column
0   0     1       NaN    NaN               Hi there!
1   1     NaN     2      Hi there!         NaN

Чтобы заменить NaN на '', выполните:

df=df.fillna('')

после where.

Тогда:

print(df)

будет:

    idx   foo     bar    Desired Column    Output Column
0   0     1                                Hi there!
1   1             2      Hi there!   

Или больше вручную, сделайте:

df['Output Column']=df['Output Column'].where(df['bar']==2,df.loc[df['bar']==2,'Desired Column'].tolist())
print(df)

Затем можно сделать то же самое, чтобы заменить NaN на ''

.

Обновление:

Первый:

df['Output Column']=df['Output Column'].where(df['foo']!=1,'Hi There!')
print(df)

Выход:

  Desired Column Output Column  bar  foo  idx
0            NaN     Hi There!  NaN  1.0    0
1      Hi There!           NaN  2.0  NaN    1
2            NaN     Hi There!  NaN  1.0    2
3            NaN           NaN  NaN  6.0    3

Второе:

df['Output Column']=df['Output Column'].where(df['foo'].notnull(),'Hi There!')
print(df)

Выход:

  Desired Column Output Column  bar  foo  idx
0            NaN           NaN  NaN  1.0    0
1      Hi There!     Hi There!  2.0  NaN    1
2            NaN           NaN  NaN  1.0    2
3            NaN           NaN  NaN  6.0    3

Может сделать то же самое, чтобы заменить NaN на ''

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...