使用Pandas重塑凌乱的数据集

使用Pandas重塑凌乱的数据集,pandas,dataframe,reshape,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.po

我从一个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格式。

将其转换为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 ]
然后,我循环遍历数据帧以构建dict:

# 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']}
如果您可以遇到两次相同的密钥,我建议使用此版本的代码,检查密钥是否已存在:

将熊猫作为pd导入
#重新创建数据帧
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']))
#根据需要拆分df;移除引线;
df=df.apply(lambda x:x.str.rstrip(“;”).str.split(“;”))
打印(df)
df_dict=dict()
对于索引,df.iterrows()中的行:
对于i,输入enumerate(第['Folders'行]):
如果df_dict中的key.strip():
df_dict[key.strip()]+=行['Files'][i].strip().split(“”)
else:df_dict[key.strip()]=行['Files'][i].strip().split(“”)
打印(df_dict)

您想找到更合适的表示法吗?这将取决于你以后要做什么,但也许更“聪明”的做法是做一份清单。在您的示例中,输出将是:
{'a':['aa.src','aa.xml'],'b':…}
是的,这样就行了。如何做到这一点?解决方案中的一个问题是,例如,当文件夹“aa”在数据集中第二次出现时,第一次迭代中的文件将替换为第二次迭代。是否可以将新文件追加或添加到已经存在的数组中?我用一个版本编辑了代码(请参见上一篇chunck)