提问者:小点点

如何合并或串连不同长度和空值的熊猫系列?


我有一系列的空白作为一些值。 像这样的东西

import pandas as pd
serie_1 = pd.Series(['a','','b','c','',''])
serie_2 = pd.Series(['','d','','','e','f','g'])

在每个系列中过滤空白没有问题,例如serie_1=serie_1[serie_1!='']

然而,当我将它们组合在一个df中时,无论是从它们构建df,还是构建两个单列df并将它们连接起来,我都没有得到我想要的结果。

我想找一张这样的桌子:

    
  col1 col2

0   a   d
1   b   e
2   c   f
3   nan g

但我得到了这样的东西

0   a   nan
1   nan d
2   b   nan
3   c   nan
4   nan e
5   nan f
6   nan g

我怎样才能得到我要找的那张桌子?

提前致谢


共3个答案

匿名用户

使用pandas.concat:

ss = [serie_1, serie_2]
df = pd.concat([s[s.ne("")].reset_index(drop=True) for s in ss], 1)
print(df)

输出:

     0  1
0    a  d
1    b  e
2    c  f
3  NaN  g

匿名用户

如果我理解正确的话,这里有一种方法:

pd.concat([
    serie_1[lambda x: x != ''].reset_index(drop=True).rename('col1'),
    serie_2[lambda x: x != ''].reset_index(drop=True).rename('col2')
], axis=1)

   col1  col2
0   a    d
1   b    e
2   c    f
3   NaN  g

逻辑是:选择非空条目(使用lambda表达式)。 从0重新开始索引编号(带有重置索引)。 设置列名(使用rename)。 创建一个宽表(在merge函数中使用axis=1)。

匿名用户

在创建数据框架之前,我只需过滤掉空白值,如下所示:

import pandas as pd

def filter_blanks(string_list):
    return [e for e in string_list if e]

serie_1 = pd.Series(filter_blanks(['a','','b','c','','']))
serie_2 = pd.Series(filter_blanks(['','d','','','e','f','g']))

pd.concat([serie_1, serie_2], axis=1)

这导致:

    0   1
0   a   d
1   b   e
2   c   f
3   NaN g