Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.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 在pandas中使用重叠索引组合不同的列_Python_Python 3.x_Pandas_Dataframe_Data Analysis - Fatal编程技术网

Python 在pandas中使用重叠索引组合不同的列

Python 在pandas中使用重叠索引组合不同的列,python,python-3.x,pandas,dataframe,data-analysis,Python,Python 3.x,Pandas,Dataframe,Data Analysis,我有一个熊猫数据框,看起来像这样: ABC_1 ABC_2 ABC_3 ABC_4 x y z k NaN y NaN k x NaN z NaN x NaN z k ... ... ... ... ABC x x x y y z z z k k k ... s = pd.conc

我有一个熊猫数据框,看起来像这样:

  ABC_1 ABC_2 ABC_3 ABC_4
    x    y       z    k
    NaN  y       NaN  k
    x    NaN      z   NaN
    x    NaN      z   k
    ...  ...     ...  ...
   ABC
   x
   x
   x
   y
   y
   z
   z
   z
   k
   k
   k
   ...
s = pd.concat([df[col] for col in df.columns])
s = s[s.notnull()] 
这只是一列ABC,它被分成了许多列。类似地,还有其他列,如
PQR
,已被分成不同的部分

  • 每列包含100个值(包括NAN),即在这种情况下,
    df
    的形状可视为
    (100,4)
  • 我想将所有四列合并为一个名为
    ABC
    的列,但它应该包含所有四列中的所有值
    NaN
    值可以在连接之前或之后删除,因此这不成问题,尽管我觉得在连接之后立即删除所有
    NaN
    会更有效
简而言之,新列应如下所示:

  ABC_1 ABC_2 ABC_3 ABC_4
    x    y       z    k
    NaN  y       NaN  k
    x    NaN      z   NaN
    x    NaN      z   k
    ...  ...     ...  ...
   ABC
   x
   x
   x
   y
   y
   z
   z
   z
   k
   k
   k
   ...
s = pd.concat([df[col] for col in df.columns])
s = s[s.notnull()] 
我尝试的是:

我试图使用
pd.concat
,但它没有起作用,因为它抛出了
重复索引错误
,从案例中可以明显看出这一点。现在,有一些方法可以解决这个问题,但我认为如果数据帧太大,计算效率就不高

我尝试将所有值放入一个列表中,然后将其分配给一个新数据帧的列,但正如我所说,数据帧可能很大,列表将占用大量空间

谁能告诉我如何有效地做到这一点

编辑:可能还有一种情况。并非所有列名都必须遵循相同的模式。例如,上面的数据框也包含如下列

ABC_1 ABC_2 ABC_3 ABC_4 ABC_5_patt
    x    y       z    k    p
    NaN  y       NaN  k    p
    x    NaN      z   NaN  p
    x    NaN      z   k    NaN
    ...  ...     ...  ...  ...
这就是
df
的外观:

   ABC_1  ABC_2
0    1.0    3.0
1    NaN    4.0
2    2.0    NaN
0    1.0
2    2.0
0    3.0
1    4.0
您可以创建如下系列:

  ABC_1 ABC_2 ABC_3 ABC_4
    x    y       z    k
    NaN  y       NaN  k
    x    NaN      z   NaN
    x    NaN      z   k
    ...  ...     ...  ...
   ABC
   x
   x
   x
   y
   y
   z
   z
   z
   k
   k
   k
   ...
s = pd.concat([df[col] for col in df.columns])
s = s[s.notnull()] 
这就是
s
的外观:

   ABC_1  ABC_2
0    1.0    3.0
1    NaN    4.0
2    2.0    NaN
0    1.0
2    2.0
0    3.0
1    4.0
如果需要,您可以重新编制
s
索引

用于删除多索引,最后用于将系列转换为一列
数据帧

df = df.unstack().dropna().reset_index(drop=True).to_frame('ABC')
print (df)
   ABC
0    x
1    x
2    x
3    y
4    y
5    z
6    z
7    z
8    k
9    k
10   k
如有可能,多个类别:

print (df)
  ABC_1 PQR_2 ABC_3 PQR_4
0     x     y     z     k
1   NaN     y   NaN     k
2     x   NaN     z   NaN
3     x   NaN     z     k

df.columns = df.columns.str.split('_', expand=True)
df = df.unstack().dropna().reset_index(level=[1,2],drop=True)
df.index = [df.groupby(level=0).cumcount(), df.index]
df = df.unstack()
print (df)
  ABC  PQR
0   x    y
1   x    y
2   x    k
3   z    k
4   z    k
5   z  NaN

如果其他列包含这样的模式,
PQR\u 4\u text
?@mlRocks-您能解释更多吗?这主要取决于数据。当然。例如,在
上拆分后,并非所有列都必须只包含两个值。可能的情况是,您在上面的示例中给出的一列可能是
PQR_4_text
,而不是
PQR_4
@mlRocks-您可以添加数据样本和预期输出吗?@mlRocks-我看到您的编辑,所以需要
df.columns=df.columns.str.split(“,”expand=True,n=1)
第二个解决方案?