Как разделить списки по диапазону столбцов? - PullRequest
1 голос
/ 06 июня 2019

У меня есть датафрейм с несколькими столбцами, который содержит список внутри.Я хочу разделить этот список на разные столбцы.В настоящее время я нашел этот вопрос здесь в stackoverflow, но кажется, что он разбивает список только на 1 столбец, который я хочу применить к нескольким столбцам, содержащим неодинаковое количество объектов в списке.

Мой df выглядит примерно так:

     ID |  value_0  |  value_1  |  value_2  | value_3   | value_4
0   1001|[1001,1002]|   None    |   None    |   None    |  None 
1   1010|[1010,2001]|[2526,1000]|   None    |   None    |  None  
2   1100|[1234,5678]|[9101,1121]|[3141,5161]|[1718,1920]|[2122,2324]

Я хочу преобразовать его в:

     ID | 0  | 1  |  2   |  3   | 4
0   1001|1001|1002| None | None | None 
1   1010|1010|2001| 2526 | 1000 | None  
2   1100|1234|5678| 9101 | 1121 | 3141 ....etc.

В настоящее время это мой код, но он выводит только кадр данных, содержащий«Нет» значение.Я не уверен, как это исправить, потому что кажется, что он получает только последний столбец и не разделяет список.

length = len(list(df.columns.values))-1

for i in range(length):
    temp = "value_" + str(i)
    x = df[temp]
    new_df = pd.DataFrame(df[temp].values.tolist())

Результат new_df, который я получил, таков:

   | 0
  0| None
  1| None
  2| [2122,2324]

Однако, если я просто фокусируюсь только на 1 столбце (т. Е. Value_0), он прекрасно разбивает список.

new_df = pd.DataFrame(df['value_0'].values.tolist())

Любая помощь очень ценится

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Сначала используйте pd.concat и pd.Series, чтобы развернуть список в отдельные столбцы и добавить к исходному df, а затем просто отбросить исходные столбцы

for i in df.columns:
    df = pd.concat([df, df[i].apply(pd.Series)], axis=1)

df.drop(['ID','value_0','value_1','value_2','value_3','value_4'], axis=1, inpalce=True)

Вывод

          0     0     1       0       1       0       1       0       1  \
   0   1001  1001  1002     NaN     NaN     NaN     NaN     NaN     NaN   
   1   1010  1010  2001  2526.0  1000.0     NaN     NaN     NaN     NaN   
   2   1100  1234  5678  9101.0  1121.0  3141.0  5161.0  1718.0  1920.0   

           0       1  
   0     NaN     NaN  
   1     NaN     NaN  
   2  2122.0  2324.0 
0 голосов
/ 06 июня 2019

Идея состоит в том, чтобы изменить значения на DataFrame.stack для удаления None значений, поэтому можно использовать конструктор DataFrame, затем изменить форму обратно на Series.unstack, отсортировать столбец и установитьимена столбцов по умолчанию:

import ast
#if strings in columns instead lists
#df.iloc[:, 1:] = df.iloc[:, 1:].applymap(ast.literal_eval)

s = df.set_index('ID', append=True).stack()

df = pd.DataFrame(s.values.tolist(), index=s.index).unstack().sort_index(axis=1, level=1)
df.columns = np.arange(len(df.columns))

df = df.reset_index(level=1)
print (df)
     ID       0       1       2       3       4       5       6       7  \
0  1001  1001.0  1002.0     NaN     NaN     NaN     NaN     NaN     NaN   
1  1010  1010.0  2001.0  2526.0  1000.0     NaN     NaN     NaN     NaN   
2  1100  1234.0  5678.0  9101.0  1121.0  3141.0  5161.0  1718.0  1920.0   

        8       9  
0     NaN     NaN  
1     NaN     NaN  
2  2122.0  2324.0  

Решение для панд 0,24+ для пропущенных значений с целыми числами:

df = df.astype('Int64').reset_index(level=1)
print (df)
     ID     0     1     2     3     4     5     6     7     8     9
0  1001  1001  1002   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
1  1010  1010  2001  2526  1000   NaN   NaN   NaN   NaN   NaN   NaN
2  1100  1234  5678  9101  1121  3141  5161  1718  1920  2122  2324
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...