У меня была проблема с simialir при работе с Pyspark и потоковым набором данных, некоторые столбцы были вложенными, а некоторые - нет.
Учитывая, что ваш фрейм данных может выглядеть следующим образом:
df = pd.DataFrame({'A' : [{1 : [1,5], 2 : [15,25], 3 : ['A','B']}],
'B' : [[[15,25,61],[44,22,87],['A','B',44]]],
'C' : [((15,25,87),(22,91))],
'D' : 15,
'E' : 'A'
})
print(df)
A \
0 {1: [1, 5], 2: [15, 25], 3: ['A', 'B']}
B C D E
0 [[15, 25, 61], [44, 22, 87], [A, B, 44]] ((15, 25, 87), (22, 91)) 15 A
Мы можем сложить ваш фрейм данных и использовать apply
с type
, чтобы получить тип каждого столбца и передать его в словарь.
df.head(1).stack().apply(type).reset_index(0,drop=True).to_dict()
out:
{'A': dict, 'B': list, 'C': tuple, 'D': int, 'E': str}
, с этим мы можем использовать функцию для возврата кортежа Вложенные и не вложенные столбцы.
Функция
def find_types(dataframe):
col_dict = dataframe.head(1).stack().apply(type).reset_index(0,drop=True).to_dict()
unnested_columns = [k for (k,v) in col_dict.items() if v not in (dict,set,list,tuple)]
nested_columns = list(set(col_dict.keys()) - set(unnested_columns))
return nested_columns,unnested_columns
В действии.
nested,unested = find_types(df)
df[unested]
D E
0 15 A
print(df[nested])
C A \
0 ((15, 25, 87), (22, 91)) {1: [1, 5], 2: [15, 25], 3: ['A', 'B']}
B
0 [[15, 25, 61], [44, 22, 87], [A, B, 44]]