Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “爆炸我的熊猫”列不再有效_Python_Pandas - Fatal编程技术网

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)
您尝试过这个问题的解决方案吗?这不是问题。好吧……让我用在apndas
1.2.3
中测试过的数据来尝试一下,并使用良好的操作解决方案(将字符串列转换为列表后)很酷。。。。pandas.explode功能在早期版本的pandas中不可用,上一次我检查我对答案做了一些更改。希望这是您的预期结果。是否尝试问题的解决方案?这不是问题。好吧……让我用在apndas
1.2.3
中测试过的数据来尝试一下,并使用良好的操作解决方案(将字符串列转换为列表后)很酷。。。。pandas.explode功能在早期版本的pandas中不可用,上次我检查我对答案做了一些更改。希望这是您的预期结果