Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.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_Dataframe - Fatal编程技术网

Python 熊猫爆炸-无法从重复轴重新建立索引

Python 熊猫爆炸-无法从重复轴重新建立索引,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有一个数据帧df: C1 C2 C3 C4 C5 0 [A] [1] s1 [123] t1 1 [A] [1] s2 321 t2 2 [A,B] [1,2] s3 [777,111] t3 3 [B] [2] s4 145 t4

假设我有一个数据帧
df

   C1      C2      C3      C4               C5
0  [A]     [1]     s1      [123]            t1  
1  [A]     [1]     s2      321              t2
2  [A,B]   [1,2]   s3      [777,111]        t3
3  [B]     [2]     s4      145              t4
4  [B]     [2]     s5      [990]            t5
5  [A,B,B] [1,2,2] s6      [124,125,765]    t6
6  [A,A]   [1,3]   s7      119              t7
我想把一切都搞清楚,所以我一直在做

df=df.apply(pd.Series.explode)

但是,这给了我
ValueError:无法从重复轴重新编制索引。我已将罪犯追查到
df
的第6行(最后一行)。当我以前在
C1
中有一些东西与
C2
中的东西长度不一样时,我明白了这一点。但我不明白爆炸最后一排有什么问题

如果我使用pd.DataFrame([[['A','B'],[1,2],'s7',119,'t7']]).apply(pd.Series.explode()
,它可以正常工作,并如预期的那样为我提供以下信息:

   C1      C2      C3      C4         C5
0  A        1      s7      119        t7  
1  A        3      s7      119        t7

我不明白为什么最后一行是整个数据帧的一部分时会导致错误。我检查了索引,它是唯一的。

边清理边工作

df = pd.DataFrame({'C1': [["A"], ["A"], ["A","B"], ["B"], ["B"], ["A","B","B"], ["A","A"]],
 'C2': [[1], [1], [1,2], [2], [2], [1,2,2], [1,3]],
 'C3': ['s1', 's2', 's3', 's4', 's5', 's6', 's7'],
 'C4': [[123], 321, [777,111], 145, [990], [124,125,765], 119],
 'C5': ['t1', 't2', 't3', 't4', 't5', 't6', 't7']})

df.explode("C1").reset_index().drop("index",1).explode("C2").reset_index()\
    .drop("index",1).explode("C4").reset_index().drop("index",1)


输出

  C1 C2  C3   C4  C5
0  A  1  s1  123  t1
1  A  1  s2  321  t2
2  A  1  s3  777  t3
3  A  1  s3  111  t3
4  A  2  s3  777  t3
5  A  2  s3  111  t3
6  B  1  s3  777  t3
7  B  1  s3  111  t3
8  B  2  s3  777  t3
9  B  2  s3  111  t3

这回答了你的问题吗?这并没有回答我的问题,但这就是应用(pd.Series.explode)的地方。。我不知道为什么它在最后一行不起作用。@formicaman你能以一种更容易复制的方式给出第一个数据帧吗?比如使用
df.head(7).to_dict()
?显然,每个列表的长度必须相同才能使用
.apply(pd.Series.explode)
——更多详细信息如下: