使用Pandas重塑凌乱的数据集
我从一个csv文件中获得了这个混乱的数据集,该文件在同一个单元格中包含多个条目。 这就是它的样子:使用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
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)