Заполните различные столбцы на основе других столбцов (первый с заголовком столбца, второй со значением для получения) - PullRequest
2 голосов
/ 03 мая 2020

Я работаю с Python 3.6.9.

Я застрял на таком фрейме данных:

import pandas as pd
import numpy as np

dict_ = {'col1': [3.14, 28, -0.618, 1.159], 'col2': ['a_002_u', 'a_003_u', 'a_001_u', 'a_003_u'], 'a_001_u': [np.nan] * 4, 'a_002_u': [np.nan] * 4, 'a_003_u': [np.nan] * 4}

df = pd.DataFrame(dict_)

     col1     col2  a_001_u  a_002_u  a_003_u
0   3.140  a_002_u      NaN      NaN      NaN
1  28.000  a_003_u      NaN      NaN      NaN
2  -0.618  a_001_u      NaN      NaN      NaN
3   1.159  a_003_u      NaN      NaN      NaN

И я хотел бы получить такой результат:

     col1     col2  a_001_u  a_002_u  a_003_u
0   3.140  a_002_u      NaN     3.14      NaN
1  28.000  a_003_u      NaN      NaN   28.000
2  -0.618  a_001_u   -0.618      NaN      NaN
3   1.159  a_003_u      NaN      NaN    1.159

Другими словами, я хотел бы заполнить столбцы 'a_001_u', 'a_002_u' и 'a_003_u' значениями 'col1' на основе заголовка столбца в 'col2'.

Это довольно легко объяснить, но у меня сложилось впечатление, что это менее очевидно для настройки. У кого-нибудь есть идея помочь мне?

Ответы [ 3 ]

2 голосов
/ 03 мая 2020

Вы можете использовать fillna после изменения формы первых 2 столбцов с помощью set_index и unstack, например:

df = df.fillna(df.set_index('col2', append=True)['col1'].unstack())
print (df)
     col1     col2  a_001_u  a_002_u  a_003_u
0   3.140  a_002_u      NaN     3.14      NaN
1  28.000  a_003_u      NaN      NaN   28.000
2  -0.618  a_001_u   -0.618      NaN      NaN
3   1.159  a_003_u      NaN      NaN    1.159

, потому что на самом деле set_index и unstack создают другие нужные вам столбцы, а fillna выполнит (строку, столбец) заполнение пропущенного значения

print(df.set_index('col2', append=True)['col1'].unstack())
col2  a_001_u  a_002_u  a_003_u
0         NaN     3.14      NaN
1         NaN      NaN   28.000
2      -0.618      NaN      NaN
3         NaN      NaN    1.159

NB: Тот же результат можно получить с помощью pivot, например df.pivot(columns='col2', values='col1')

1 голос
/ 03 мая 2020

Вы можете написать это, перебирая строки.

for index, row in df.iterrows():
    row[row['col2']]=row['col1']
0 голосов
/ 03 мая 2020
import pandas as pd
import numpy as np

dict_ = {'col1': [3.14, 28, -0.618, 1.159], 'col2': ['a_002_u', 'a_003_u', 'a_001_u', 'a_003_u'], 'a_001_u': [np.nan] * 4, 'a_002_u': [np.nan] * 4, 'a_003_u': [np.nan] * 4}

df = pd.DataFrame(dict_)
count = 0
for key in df['col2']:
    df[key][count] = df['col1'][count]
    count += 1

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