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)
第二个解决方案?