Изменить только на два столбца в pandas - PullRequest
0 голосов
/ 18 февраля 2020

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

Предположим, у меня есть длинный набор данных из двух столбцов, например:

test = pd.DataFrame(
       {
          'color': ['white', 'white', 'white', 
                    'red', 'red', 'red', 
                    'black', 'black', 'black'],
           'value': [1,2,3,4,5,6,7,8,9]
       })

Как я могу получить его в следующем формате:

    white   red    black
    1        4       7
    2        5       8 
    3        6       9 

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

test.pivot('color', 'value'), но это дает значения в диагонали с окружающим NaN. Есть ли способ обойти это?

Ответы [ 3 ]

0 голосов
/ 18 февраля 2020

Я сделал несколько быстрых решений, используя группирование по функциям, используя библиотеку pandas

 for i in test.groupby('color'):
     print(i[0])
     for j in range(len(i[1])):
         for k in i[1].values:
             print(k[1])
         break 

Вывод:

black
7
8 
9
red
4  
5
6
white
1
2
3
0 голосов
/ 18 февраля 2020

Вы можете создавать серии, сбрасывать индексы и заново создавать фреймы данных из 3 серий:

df = pd.DataFrame({'color': ['white', 'white', 'white', 'red', 'red', 'red', 'black', 'black', 'black'],
'value': [1,2,3,4,5,6,7,8,9]})

serie_white = df['value'][df['color'] == "white"].reset_index(drop=True)
serie_red = df['value'][df['color'] == "red"].reset_index(drop=True)
serie_black = df['value'][df['color'] == "black"].reset_index(drop=True)

result = pd.DataFrame({'white': serie_white, 'red': serie_red, 'black': serie_black})
print(result)

Вывод:

   white  red  black
0      1    4      7
1      2    5      8
2      3    6      9
0 голосов
/ 18 февраля 2020

Попробуйте:

test["id"]=test.groupby("color")["color"].cumcount()

test.pivot(index="id", columns="color", values="value")

Выходы:

color  black  red  white
id
0          7    4      1
1          8    5      2
2          9    6      3
...