Python 3, Pandas csv-строка, в некоторых полях которой есть ключи / значения. Как свести это в один широкий ряд - PullRequest
2 голосов
/ 06 августа 2020

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

Итак, по сути, у меня есть такие данные,

+------+------+-------------------+------+------+
| col1 | col2 | col3              | col4 | col5 |
+------+------+-------------------+------+------+
| v    | v    | ncol1=nv,ncol2=nv | v    | v    |
+------+------+-------------------+------+------+
| v    | v    | ncol3=nv          | v    | v    |
+------+------+-------------------+------+------+
| v    | v    |                   | v    | v    |
+------+------+-------------------+------+------+

И я пытаюсь получить что-то вроде

+------+------+-------+-------+-------+------+------+
| col1 | col2 | ncol1 | ncol2 | ncol3 | col4 | col5 |
+------+------+-------+-------+-------+------+------+
| v    | v    | nv    | nv    |       | v    | v    |
+------+------+-------+-------+-------+------+------+
| v    | v    |       |       | nv    | v    | v    |
+------+------+-------+-------+-------+------+------+
| v    | v    |       |       |       | v    | v    |
+------+------+-------+-------+-------+------+------+

1 Ответ

0 голосов
/ 06 августа 2020

Предполагая, что значения DataFrame в столбце C представляют собой строку, разделенную запятыми, код выполняет следующие действия:

  1. Создает словарь из строки, разделенной запятыми
  2. Удаляет все значения NULL оцененные строки / пустые строки, присутствующие в столбце C, так что ранее созданный объект словаря может быть расширен
  3. Динамически создает новые столбцы на основе ключей словаря
  4. Расширяет словарь
  5. Объединяет фрейм данных с нулевым значением и вновь созданный фрейм данных
import pandas as pd
import numpy as np
df=pd.DataFrame({"A":['a','b','c',],"B":['e','f','d'],"C":['D=nv,E=nv',np.nan,"D=nv"],})
#Converts string to dictionary of key-value pairs
df.loc[:,"C"]=df.loc[:,"C"].apply(lambda x: dict(map(lambda z: z.split('='),x.split(","))) if type(x)==str else np.nan)
#Drop all null values present in Column so that the dataframe can be expanded
#Separate the null and actual rows containing values into 2 separate dataframes
df_act=df.dropna(subset=["C"])
df_null=df[~df.index.isin(df_act.index)]
#Expand the Column and store in a temporary DataFrame
df_temp=df_act['C'].apply(pd.Series)
for cols in df_temp.columns:
    df_act.loc[:,cols]=np.nan
    df_null.loc[:,cols]=np.nan

#Save Contents in the actual DataFrame
df_act[df_temp.columns]=df_temp
#Drop C Column to match with Sample Output
df_act.drop("C", axis=1, inplace=True)
df_null.drop("C", axis=1, inplace=True)
#Concatenate the DataFrames
final_df=pd.concat([df_act, df_null])

Обратите внимание, что удаление столбца C выполняется только для того, чтобы выходные данные совпадали с предоставленным образцом выходных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...