Python “爆炸我的熊猫”列不再有效
我需要分解以下数据集中的一些列:Python “爆炸我的熊猫”列不再有效,python,pandas,Python,Pandas,我需要分解以下数据集中的一些列: Date Borr Year Acc Grade 2020-06-30 borrower1 2001.0 ['acc1', 'acc2', 'acc3',...] [3.6, 5.2, 3.8,...] 2020-06-30 borrower1 2001.0 ['acc1', 'acc2', 'acc3',...] [3.6, 5.2, 3.8,...] 2020-06-30 borrower2 2005.0
Date Borr Year Acc Grade
2020-06-30 borrower1 2001.0 ['acc1', 'acc2', 'acc3',...] [3.6, 5.2, 3.8,...]
2020-06-30 borrower1 2001.0 ['acc1', 'acc2', 'acc3',...] [3.6, 5.2, 3.8,...]
2020-06-30 borrower2 2005.0 ['acc23', 'acc21'] [6.6, 5.2]
我是这样做的
new_df=df.apply(pd.Series.explode).reset_index()
但它仍然包含列表。每个科目我都有一个分数。
我一直使用上面的例子中的explode(说实话,直到几天前它还有效)。
有人知道为什么它不再起作用了吗?
我已经研究了其他问题(例如),因此请不要将此问题视为重复问题,因为它不是。我认为首先有必要将列转换为列表,因为如果不起作用,
explode
有字符串:
import ast
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(ast.literal_eval)
或者如果可能,可以使用一些None
s:
import json
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(json.loads)
def custom_conv(x):
try:
return ast.literal_eval(x)
except:
return []
import ast
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(custom_conv)
如果某些数据被破坏,则可以使用:
import json
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(json.loads)
def custom_conv(x):
try:
return ast.literal_eval(x)
except:
return []
import ast
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(custom_conv)
编辑:
对于我来说,在熊猫1.2.3中工作得很好:
a = ['[6.6, 5.2, 4.8, 3.1, 2.9]', '[6.6, 5.2, 4.8, 3.1, 2.9]', '[6.6, 2.2, 4.8, 3.1, 2.9]', '[33.7, 35.0, 31.9, 25.2, 25.9]', '[33.7, 35.0, 31.9, 25.2, 25.9]']
b = ["['acc1', 'acc2', 'acc3', 'acc4', 'acc5']", "['acc1', 'acc2', 'acc3', 'acc4', 'acc5']", "['acc1', 'acc2', 'acc3', 'acc4', 'acc5']", "['acc10', 'acc11', 'acc14', 'acc5', 'acc6']", "['acc10', 'acc11', 'acc14', 'acc5', 'acc6']"]
df = pd.DataFrame({'Year':[2001,2001,2005, 2006, 2007],
'Acc':a,
'Grade':b})
print (df)
Year Acc \
0 2001 [6.6, 5.2, 4.8, 3.1, 2.9]
1 2001 [6.6, 5.2, 4.8, 3.1, 2.9]
2 2005 [6.6, 2.2, 4.8, 3.1, 2.9]
3 2006 [33.7, 35.0, 31.9, 25.2, 25.9]
4 2007 [33.7, 35.0, 31.9, 25.2, 25.9]
Grade
0 ['acc1', 'acc2', 'acc3', 'acc4', 'acc5']
1 ['acc1', 'acc2', 'acc3', 'acc4', 'acc5']
2 ['acc1', 'acc2', 'acc3', 'acc4', 'acc5']
3 ['acc10', 'acc11', 'acc14', 'acc5', 'acc6']
4 ['acc10', 'acc11', 'acc14', 'acc5', 'acc6']
我认为首先必须将列转换为列表,因为如果不工作,则会出现字符串:
import ast
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(ast.literal_eval)
或者如果可能,可以使用一些None
s:
import json
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(json.loads)
def custom_conv(x):
try:
return ast.literal_eval(x)
except:
return []
import ast
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(custom_conv)
如果某些数据被破坏,则可以使用:
import json
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(json.loads)
def custom_conv(x):
try:
return ast.literal_eval(x)
except:
return []
import ast
df[['Acc', 'Grade']] = df[['Acc', 'Grade']].applymap(custom_conv)
编辑:
对于我来说,在熊猫1.2.3中工作得很好:
a = ['[6.6, 5.2, 4.8, 3.1, 2.9]', '[6.6, 5.2, 4.8, 3.1, 2.9]', '[6.6, 2.2, 4.8, 3.1, 2.9]', '[33.7, 35.0, 31.9, 25.2, 25.9]', '[33.7, 35.0, 31.9, 25.2, 25.9]']
b = ["['acc1', 'acc2', 'acc3', 'acc4', 'acc5']", "['acc1', 'acc2', 'acc3', 'acc4', 'acc5']", "['acc1', 'acc2', 'acc3', 'acc4', 'acc5']", "['acc10', 'acc11', 'acc14', 'acc5', 'acc6']", "['acc10', 'acc11', 'acc14', 'acc5', 'acc6']"]
df = pd.DataFrame({'Year':[2001,2001,2005, 2006, 2007],
'Acc':a,
'Grade':b})
print (df)
Year Acc \
0 2001 [6.6, 5.2, 4.8, 3.1, 2.9]
1 2001 [6.6, 5.2, 4.8, 3.1, 2.9]
2 2005 [6.6, 2.2, 4.8, 3.1, 2.9]
3 2006 [33.7, 35.0, 31.9, 25.2, 25.9]
4 2007 [33.7, 35.0, 31.9, 25.2, 25.9]
Grade
0 ['acc1', 'acc2', 'acc3', 'acc4', 'acc5']
1 ['acc1', 'acc2', 'acc3', 'acc4', 'acc5']
2 ['acc1', 'acc2', 'acc3', 'acc4', 'acc5']
3 ['acc10', 'acc11', 'acc14', 'acc5', 'acc6']
4 ['acc10', 'acc11', 'acc14', 'acc5', 'acc6']
你可以试试这个解决方案。正如您共享的上所指出的,它说熊猫没有多列爆炸。试试这个,它可能对你有帮助
df.设置索引(“Acc”).应用(pd.系列.分解).重置索引()
df.set\u index('Grade')。应用(pd.Series.explode)。重置\u index()
下面是经过编辑的答案
我相信一定有更好的解决方案。但是你可以检查这个代码
import ast
df = pd.read_csv('/home/deepak/Desktop/data.txt',sep='\t')
df['Acc']=df['Acc'].apply(lambda s: list(ast.literal_eval(s)))
df['Grade'] = df['Grade'].apply(lambda s: list(ast.literal_eval(s)))
temp_df_1 = df[['Date', 'Borr', 'Year', 'Acc']].explode('Acc')
temp_df_1.reset_index(inplace=True,drop=True)
temp_df_2 = df[['Date', 'Borr', 'Year', 'Grade']].explode('Grade')
temp_df_2.reset_index(inplace=True,drop=True)
result_df = pd.concat([temp_df_1,temp_df_2],axis=1)
result_df = result_df.iloc[:,[0,1,2,3,7]]
您可以尝试此解决方案。正如您共享的上所指出的,它说熊猫没有多列爆炸。试试这个,它可能对你有帮助
df.设置索引(“Acc”).应用(pd.系列.分解).重置索引()
df.set\u index('Grade')。应用(pd.Series.explode)。重置\u index()
下面是经过编辑的答案
我相信一定有更好的解决方案。但是你可以检查这个代码
import ast
df = pd.read_csv('/home/deepak/Desktop/data.txt',sep='\t')
df['Acc']=df['Acc'].apply(lambda s: list(ast.literal_eval(s)))
df['Grade'] = df['Grade'].apply(lambda s: list(ast.literal_eval(s)))
temp_df_1 = df[['Date', 'Borr', 'Year', 'Acc']].explode('Acc')
temp_df_1.reset_index(inplace=True,drop=True)
temp_df_2 = df[['Date', 'Borr', 'Year', 'Grade']].explode('Grade')
temp_df_2.reset_index(inplace=True,drop=True)
result_df = pd.concat([temp_df_1,temp_df_2],axis=1)
result_df = result_df.iloc[:,[0,1,2,3,7]]
什么是
打印(df['Grade'].head().tolist())
?感谢您的评论和建议,耶兹雷尔。它返回这个列表:“[6.6,5.2,4.8,3.1,2.9]”,“[6.6,5.2,4.8,3.1,2.9]”,“[6.6,2.2,4.8,3.1,2.9]”,“[33.7,35.0,31.9,25.2,25.9]”,“[33.7,35.0,31.9,25.2,25.9]”谢谢,回答贝娄应该可以工作。我相信熊猫没有多列(df Grade[.tolist())
?感谢您的评论和建议,耶兹雷尔。它返回这个列表:“[6.6,5.2,4.8,3.1,2.9]”,“[6.6,5.2,4.8,3.1,2.9]”,“[6.6,2.2,4.8,3.1,2.9]”,“[33.7,35.0,31.9,25.2,25.9]”,“[33.7,35.0,31.9,25.2,25.9]”谢谢,回答贝娄应该有效。我相信熊猫没有多列explode@LdM-hmmm,什么是打印(df['Acc'].head().tolist())?@LdM-hmmm,试着用最后一种方法来解决这个问题json@LdM-什么是打印(df['Acc'].head().tolist())
?应用上一个解决方案后:[[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]
。在应用它之前:[“['acc1'、'acc2'、'acc3'、'acc4'、'acc5']”、“['acc1'、'acc2'、'acc3'、'acc4'、'acc5']”、“['acc10'、'acc11'、'acc14'、'acc5'、'acc6']”、“['acc10'、'acc11'、'acc14'、'acc6']”等。我最近在笔记本电脑上更新了SO。我正在使用的pandas/Jupyter笔记本上可能会发生什么事情?以前,我问题中的代码运行良好。。。版本是1.1。3@LdM-如果工作正常,则超级;)和nodes=df['Acc'].explode().unique()
在df['Acc',Grade']=df['Acc',Grade']]之后应该可以正常工作。applymap(ast.literal_eval)
@LdM-hmmm,什么是打印(df['Acc'].head().tolist())
?@LdM-hmmm,尝试最后一种解决方案json@LdM-什么是打印(df['Acc'].head().tolist())
?应用上一个解决方案后:[[]、[]、[]、[]、[]、[]、[]、[]、[]]
。在应用它之前:[“['acc1'、'acc2'、'acc3'、'acc4'、'acc5']”、“['acc1'、'acc2'、'acc3'、'acc4'、'acc5']”、“['acc10'、'acc11'、'acc14'、'acc5'、'acc6']”、“['acc10'、'acc11'、'acc14'、'acc6']”等。我最近在笔记本电脑上更新了SO。我正在使用的pandas/Jupyter笔记本上可能会发生什么事情?以前,我问题中的代码运行良好。。。版本是1.1。3@LdM-如果工作正常,则超级;)和nodes=df['Acc'].explode().unique()
在df[['Acc','Grade']=df['Acc','Grade']]之后应该可以很好地工作。applymap(ast.literal\u eval)
您尝试过这个问题的解决方案吗?这不是问题。好吧……让我用在apndas1.2.3
中测试过的数据来尝试一下,并使用良好的操作解决方案(将字符串列转换为列表后)很酷。。。。pandas.explode功能在早期版本的pandas中不可用,上一次我检查我对答案做了一些更改。希望这是您的预期结果。是否尝试问题的解决方案?这不是问题。好吧……让我用在apndas1.2.3
中测试过的数据来尝试一下,并使用良好的操作解决方案(将字符串列转换为列表后)很酷。。。。pandas.explode功能在早期版本的pandas中不可用,上次我检查我对答案做了一些更改。希望这是您的预期结果