Распаковка ячеек, содержащих список списков в Pandas DataFrame, в отдельные строки и столбцы нового DataFrame - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть DataFrame df:

    a  b                   c
0   7  5  [[-4, 7], [-5, 6]]
1  13  5  [[-9, 4], [-3, 7]]

Я хочу свести столбец со списком ячеек списков (столбец 'c') в отдельный DataFrame, такой что:

  1. Отдельные списки соответствуют отдельным записям
  2. Элементы отдельных списков разбиты на новые столбцы

Мне удается получить желаемый результат ниже (я понимаю, что былопреобразование int в float, но это меня не беспокоит):

    a  b    d    e
0   7  5 -4.0  7.0
1   7  5 -5.0  6.0
2  13  5 -9.0  4.0
3  13  5 -3.0  7.0

Однако я считаю, что способ, которым я это делаю, не идеален, так как он сначала использует много кода,и во-вторых использует iterrows().

Ниже мой код:

old_cols = list(df)
old_cols.remove('c')
new_cols = ['d', 'e']
all_cols = old_cols + new_cols
df_flat = pd.DataFrame(columns=all_cols)
for idx, row in df.iterrows():
    data = row['c']
    for entry in data:
        temp_series = pd.Series(index=new_cols)
        temp_series['d'] = entry[0]
        temp_series['e'] = entry[1]
        new_row = pd.concat([row[old_cols], temp_series])
        df_flat = df_flat.append(new_row, ignore_index=True)

1 Ответ

0 голосов
/ 15 ноября 2018

Используя groupby + apply с pd.DataFrame:

df = df.groupby(['a','b'])\
       .apply(lambda x: pd.DataFrame(x['c'].tolist()[0], columns=['c','d']))\
       .reset_index([0,1]).reset_index(drop=True)

print(df)
    a  b  c  d
0   7  5 -4  7
1   7  5 -5  6
2  13  5 -9  4
3  13  5 -3  7

Объяснение:

Так как для каждого значения в столбце c указаны списки.Чтобы упаковать их и сделать из них разные столбцы, мы берем x['c'].tolist(), это содержит 2 открытых и закрытых скобки ([[[values],[values]]]), которые бесполезны, поэтому x['c'].tolist()[0] дает [[values],[values]], который используется в качестве данных для pd.DataFrame со столбцами ['c','d'] и окончательно reset_index на levels = [0,1], которые являются столбцами ['a','b'].

print(pd.DataFrame([[-4, 7], [-5, 6]],columns=['c','d']))
   c  d
0 -4  7
1 -5  6

print(df.groupby(['a','b'])\
        .apply(lambda x: pd.DataFrame(x['c'].tolist()[0], columns=['c','d'])))
        c  d
a  b        
7  5 0 -4  7
     1 -5  6
13 5 0 -9  4
     1 -3  7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...