使用熊猫重塑凌乱的数据集

时间:2020-08-04 19:37:18

标签: pandas dataframe reshape

我从一个csv文件中获得了这个凌乱的数据集,该文件在同一单元格中包含多个条目。 看起来是这样:

file = ('messy.csv')
df = pd.read_csv(file)

df.head()


Folders            Files
                                          
aa; bb;            aa.src aa.xml ; bb.src bb.war ;
cc;                cc.pom cc.py cc.js ;
dd; ee; ff;        dd.ts dd.js ; ee.py ; ff.xml ff.js ;

在“文件夹”列中,值用分号“;”分隔。在“文件”列中,值用空格和分号“;”分隔。属于同一文件夹的文件仅用空格分隔。我需要帮助以将其重塑为更易于管理的数据框或JSON-dict / list。我没有找到很多示例,在这些示例中我可以从同一个单元格中获取多个值。

当然,“可管理”格式有点模棱两可,但是有什么比这更好的了……

类似这样的东西:

Folders            Files 1   Files 2   Files 3
                                          
aa                 aa.src    aa.xml    NaN
bb                 bb.src    bb.war    NaN
cc                 cc.pom    cc.py     cc.js
dd                 dd.ts     dd.js     NaN
ee                 ee.py     NaN       NaN
ff                 ff.xml    ff.js     NaN

或者,如果有更好的想法,我愿意提出建议。重塑后,它将转换为JSON格式。

1 个答案:

答案 0 :(得分:1)

将其转换为json / dict

好吧,可能不是最有效的解决方案,但它可以起作用:

import pandas as pd

# Recreating the dataframe
df = pd.DataFrame({'Folders':["aa; bb;", "cc", "dd; ee; ff;"], 'Files':['aa.src aa.xml ; bb.src bb.war ;', 'cc.pom cc.py cc.js ;', 'dd.ts dd.js ; ee.py ; ff.xml ff.js ;']})

#Split df according to ; and removing leading ;
df = df.apply(lambda x: x.str.rstrip(';').str.split(';'))
print(df)

所以现在您的数据框如下所示:

          Folders                                    Files
0       [aa,  bb]        [aa.src aa.xml ,  bb.src bb.war ]
1            [cc]                    [cc.pom cc.py cc.js ]
2  [dd,  ee,  ff]  [dd.ts dd.js ,  ee.py ,  ff.xml ff.js ]

然后我遍历数据框以构建字典:

# Creating the dict by looping through the dataframe and number of elements of folders
df_dict=dict()
for index, row in df.iterrows():
  for i, key in enumerate(row['Folders']):
    df_dict[key.strip()] = row['Files'][i].strip().split(' ')

print(df_dict)
    

这是输出:

{'aa': ['aa.src', 'aa.xml'], 'bb': ['bb.src', 'bb.war'], 'cc'
: ['cc.pom', 'cc.py', 'cc.js'], 'dd': ['dd.ts', 'dd.js'], 'ee
': ['ee.py'], 'ff': ['ff.xml', 'ff.js']}

如果您可能遇到两次相同的密钥,我建议使用此版本的代码检查密钥是否已经存在:

import pandas as pd

# Recreating the dataframe
df = pd.DataFrame({'Folders':["aa; bb;", "cc", "dd; ee; ff;", 'aa'], 'Files':['aa.src aa.xml ; bb.src bb.war ;', 'cc.pom cc.py cc.js ;', 'dd.ts dd.js ; ee.py ; ff.xml ff.js ;', 'aa.tst']})

#Split df according to ; and removing leading ;
df = df.apply(lambda x: x.str.rstrip(';').str.split(';'))
print(df)

df_dict=dict()
for index, row in df.iterrows():
  for i, key in enumerate(row['Folders']):
    if key.strip() in df_dict:
      df_dict[key.strip()] += row['Files'][i].strip().split(' ')
    else: df_dict[key.strip()] = row['Files'][i].strip().split(' ')

print(df_dict)