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