我有一个熊猫数据框,看起来像这样:
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
,已分为许多列。同样,还有PQR
之类的其他列已分为不同的部分。
df
的形状在这种情况下可以视为(100,4)
。ABC
的列,但它应包含所有四列的所有值。可以事先删除NaN
值,也可以在连接后删除它们,尽管我认为在连接后立即删除所有NaNs
会更有效。简而言之,新列应如下所示:
ABC
x
x
x
y
y
z
z
z
k
k
k
...
我尝试过的事情:
我尝试使用pd.concat
,但由于它抛出duplicate index error
,因此无法正常工作,这种情况很明显。现在,有很多方法可以解决这个问题,但是如果数据帧很大,我认为它的计算效率将不高。
我尝试将所有值放入单个列表中,然后将其分配给新数据框的列,但是正如我所说的,数据框可能很大,列表会占用很多空间。
谁能告诉我如何有效地做到这一点?
编辑:可能还有另外一种情况。并非所有列名都遵循相同的模式。例如,上面的数据框也包含这样的列
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
... ... ... ... ...
答案 0 :(得分:3)
将unstack
与dropna
一起使用,并删除MultiIndex reset_index
,最后to_frame
将Series转换为一列DataFrame
:
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
答案 1 :(得分:0)
import numpy as np
x = {"ABC_1": [1, np.nan, 2], "ABC_2": [3, 4, np.nan]}
df = pd.DataFrame(x)
df
的外观如下:
ABC_1 ABC_2
0 1.0 3.0
1 NaN 4.0
2 2.0 NaN
您可以创建这样的系列:
s = pd.concat([df[col] for col in df.columns])
s = s[s.notnull()]
s
如下所示:
0 1.0
2 2.0
0 3.0
1 4.0
如果需要,您可以重新索引s