丢弃pandas数据框中的randmly分散的空白空间

时间:2017-10-20 10:44:42

标签: python pandas

如何忽略数据帧内随机分布在数据帧中的空单元格?这是我所拥有的一个例子

 ColA    ColB    ColC    ColD    ColF    ColG    ColH
  A               b                                D
          W                      R                 D
  J                        H              T 
  Q               A                                O

每行总共有3个条目,但空单元格是随机的。我看了here,但由于数据的随机性,它没有帮助

我期待的输出是:

 ColA_New    ColB_New    ColC_New     
  A        b       D      
  W        R       D               
  J        H       T        
  Q        A       O                             

4 个答案:

答案 0 :(得分:5)

类似于@cᴏʟᴅsᴘᴇᴇᴅ的解决方案:

In [185]: pd.DataFrame(df.stack().values.reshape(-1,3), 
                       columns='ColA_New ColB_New ColC_New'.split(), 
                       index=df.index)
Out[185]:
  ColA_New ColB_New ColC_New
0        A        b        D
1        W        R        D
2        J        H        T
3        Q        A        O

答案 1 :(得分:4)

假设您的空格为NaN s,请将df.notnull与numpy的索引和reshape结合使用。请注意,花式列命名逻辑适用于任意数量的列。

print(df)
  ColA ColB ColC ColD ColF ColG ColH
0    A  NaN    b  NaN  NaN  NaN    D
1  NaN    W  NaN  NaN    R  NaN    D
2    J  NaN  NaN    H  NaN    T  NaN
3    Q  NaN    A  NaN  NaN  NaN    O

m = df.notnull()
x = m.sum(1).max()

df = pd.DataFrame(df.values[m].reshape(-1, x))\
           .rename(columns=lambda x: 'Col_' + chr(ord('A') + x))

print(df)
  Col_A Col_B Col_C
0     A     b     D
1     W     R     D
2     J     H     T
3     Q     A     O

相反,如果您的数据框包含空格,请使用df.ne,其余内容相同。

m = df.ne('')

如果这是您的CSV文件的外观,那么您不需要任何此类文件。相反,使用pd.read_csv

加载CSV时,问题可能会被扼杀在萌芽状态
df = pd.read_csv('file.csv', skiprows=1, delim_whitespace=True)

如果需要,您可以使用rename重命名列,如上所述。

答案 2 :(得分:3)

还有

ndf = df.replace('',np.nan).apply(sorted,key=pd.isnull,axis=1).add_suffix('_NEW')
ndf = ndf.loc[:,~ndf.isnull().all()]
 ColA_NEW ColB_NEW ColC_NEW
0        A        b        D
1        W        R        D
2        J        H        T
3        Q        A        O

答案 3 :(得分:3)

dropna的解决方案:

df1 = df.apply(lambda x: pd.Series(x.dropna().values), axis=1)
df1.columns = df.columns[:len(df1.columns)]
print (df1)
  ColA ColB ColC
0    A    b    D
1    W    R    D
2    J    H    T
3    Q    A    O