Объединяющие колонны в пандах - PullRequest
0 голосов
/ 24 июня 2019

У меня есть датафрейм для панд:

index  country   value1   value2   value3
  0      USA      6         5        4
  1      USA      4         7        3
  2      USA      3         2        1
  3      CAN      4         5        7
  4      CAN      10        8        6

Я хочу преобразовать это в ориентированный на столбцы фрейм данных, как показано ниже для каждого значения (то есть значение1, значение2 или значение3)

Первый кадр данных для значения1 должен выглядеть следующим образом:

index   USA     CAN
  0      6       4 
  1      4       10
  2      3       NaN

Я пробовал этот код

column = ['USA', 'CAN']
df_value1 = pd.DataFrame(columns=column)
temp = df['value1'].where(df['country']=='USA').dropna()
df_value1['USA'] = temp
temp = df['value1'].where(df['country']=='CAN').dropna()
pd.concat([df_value1, temp], axis=1, ignore_index=True)

Когда я объединяюсь вдоль столбца (ось = 1), поскольку значения CAN начинаются со строки 3, я получаю результирующий кадр данных df_vaue1, подобный этому:

index   USA     CAN
  0      6       NaN
  1      4       NaN
  2      3       NaN
  3     NaN       4
  4     NaN       10

Но я хочу кадр данных df_value1, подобный этому:

index   USA     CAN
  0      6       4 
  1      4       10
  2      3       NaN

Как мне этого добиться?

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

Вам нужно:

import itertools
dataframes = {}
for v in df.filter(like='value').columns:
    nest = [df[v].loc[col] for col in cols]
    dataframes[v] = pd.DataFrame((y for y in itertools.zip_longest(*nest)), columns=cols)

Так что, dataframes['value1'] дает:

  USA   CAN
0   6   4.0
1   4   10.0
2   3   NaN
2 голосов
/ 24 июня 2019

Я полагаю, index - это индекс вашего df.Вам нужно set_index на country и cumcount и unstack

df1 = df.set_index([df.groupby('country').cumcount(), 'country']).unstack()

, если index является столбцом вашего df, вам нужно дополнительно drop следующим образом

df1 = df.drop('index',1).set_index([df.groupby('country').cumcount(), 'country']).unstack()


Out[1959]:
        value1      value2      value3
country    CAN  USA    CAN  USA    CAN  USA
0          4.0  6.0    5.0  5.0    7.0  4.0
1         10.0  4.0    8.0  7.0    6.0  3.0
2          NaN  3.0    NaN  2.0    NaN  1.0

Начиная с df1 и выше, если вам нужно value1, просто выполните нарезку следующим образом:

df1['value1']

Out[1960]:
country   CAN  USA
0         4.0  6.0
1        10.0  4.0
2         NaN  3.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...