Переместить значения в строках в новом столбце в пандах - PullRequest
0 голосов
/ 03 октября 2018

У меня есть DataFrame со столбцом Ids и несколькими столбцами с данными, например, столбец «значение» в этом примере.

enter image description here

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

enter image description here

Я думаю, что естьпротивоположная функция «растопить», которая позволяет это, но я не понимаю, как повернуть этот DF.

Диктофоны для входных и выходных DF:

d = {"id":[1,1,1,2,2,3,3,4,5],"value":[12,13,1,22,21,23,53,64,9]}
d2 = {"id":[1,2,3,4,5],"value1":[12,22,23,64,9],"value2":[1,21,53,"","",],"value3":[1,"","","",""]}

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Вы можете GroupBy перейти к списку, а затем развернуть серию списков:

df = pd.DataFrame(d)                                            # create input dataframe
res = df.groupby('id')['value'].apply(list).reset_index()       # groupby to list
res = res.join(pd.DataFrame(res.pop('value').values.tolist()))  # expand lists to columns

print(res)

   id   0     1    2
0   1  12  13.0  1.0
1   2  22  21.0  NaN
2   3  23  53.0  NaN
3   4  64   NaN  NaN
4   5   9   NaN  NaN

Как правило, такие операции будут дорогостоящими, поскольку число столбцов является произвольным.Решения Pandas / NumPy работают лучше всего, когда вы можете предварительно выделить память, что здесь невозможно.

0 голосов
/ 03 октября 2018

Создать MultiIndex с помощью cumcount, изменить его на unstack и добавить имена столбцов изменения на add_prefix:

df = (df.set_index(['id',df.groupby('id').cumcount()])['value']
        .unstack()
        .add_prefix('value')
        .reset_index())
print (df)

   id  value0  value1  value2
0   1    12.0    13.0     1.0
1   2    22.0    21.0     NaN
2   3    23.0    53.0     NaN
3   4    64.0     NaN     NaN
4   5     9.0     NaN     NaN

Пропущенные значения можно заменить на fillna, но получить смешанные числа со строковыми данными, поэтому некоторые функции должны завершиться с ошибкой:

df = (df.set_index(['id',df.groupby('id').cumcount()])['value']
        .unstack()
        .add_prefix('value')
        .reset_index()
        .fillna(''))
print (df)

   id  value0 value1 value2
0   1    12.0     13      1
1   2    22.0     21       
2   3    23.0     53       
3   4    64.0              
4   5     9.0          
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...