使用分隔符 pandas python 将单元格连接成字符串

Posted

技术标签:

【中文标题】使用分隔符 pandas python 将单元格连接成字符串【英文标题】:Concatenate cells into a string with separator pandas python 【发布时间】:2015-07-11 02:42:12 【问题描述】:

鉴于以下情况:

df = pd.DataFrame('col1' : ["a","b"],
            'col2'  : ["ab",np.nan], 'col3' : ["w","e"])

我希望能够创建一个列,将所有三列的内容连接成一个字符串,用字符“*”分隔,同时忽略NaN

所以我会得到类似的东西,例如:

a*ab*w
b*e

有什么想法吗?

刚刚意识到还有一些额外的要求,我需要该方法来处理整数和浮点数,并且还能够处理特殊字符(例如,西班牙字母表的字母)。

【问题讨论】:

我用这个来测试我的答案:df = pd.DataFrame('col1' : ["a","b",3,'ñ'], 'col2' : ["ab",np.nan, 4,'ñ'], 'col3' : ["w","e", 6,'ñ']) 它仍然有效 【参考方案1】:
In [68]:

df['new_col'] = df.apply(lambda x: '*'.join(x.dropna().values.tolist()), axis=1)
df
Out[68]:
  col1 col2 col3 new_col
0    a   ab    w  a*ab*w
1    b  NaN    e     b*e

更新

如果你有整数或浮点数,你可以先将它们转换为str

In [74]:

df = pd.DataFrame('col1' : ["a","b",3],
            'col2'  : ["ab",np.nan, 4], 'col3' : ["w","e", 6])
df
Out[74]:
  col1 col2 col3
0    a   ab    w
1    b  NaN    e
2    3    4    6
In [76]:

df['new_col'] = df.apply(lambda x: '*'.join(x.dropna().astype(str).values), axis=1)
df
Out[76]:
  col1 col2 col3 new_col
0    a   ab    w  a*ab*w
1    b  NaN    e     b*e
2    3    4    6   3*4*6

另一个更新

In [81]:

df = pd.DataFrame('col1' : ["a","b",3,'ñ'],
            'col2'  : ["ab",np.nan, 4,'ü'], 'col3' : ["w","e", 6,'á'])
df
Out[81]:
  col1 col2 col3
0    a   ab    w
1    b  NaN    e
2    3    4    6
3    ñ    ü    á

In [82]:

df['new_col'] = df.apply(lambda x: '*'.join(x.dropna().astype(str).values), axis=1)
​
df
Out[82]:
  col1 col2 col3 new_col
0    a   ab    w  a*ab*w
1    b  NaN    e     b*e
2    3    4    6   3*4*6
3    ñ    ü    á   ñ*ü*á

我的代码仍然适用于西班牙语字符

【讨论】:

Great 似乎工作得很好。一个问题,如果我混合了一个整数,python 会不高兴。知道如何即时将事物转换为字符串吗? 谢谢!该死的,我也有烦人的字符(西班牙语字母,所以我收到以下错误):'ascii' codec can't encode character u'\xf3' in position 6: ordinal not in range(128) 尝试解决最后一个错误,如果无法解决,请提出另一个问题,因为它与您最初的问题无关【参考方案2】:
In [1556]: df.apply(lambda x: '*'.join(x.dropna().astype(str).values), axis=1)
Out[1556]: 
0    a*ab*w
1       b*e
2     3*4*�
3     ñ*ü*á
dtype: object

【讨论】:

哎呀没有看到这个答案是第一个。太好了,我应该考虑使用 apply。我最终遇到了一些整数和特殊字符(如西班牙字母)的问题。下面的答案解决了我的整数问题,但正在等待有关如何处理u'\xf3'等特殊字符的答案。 @Bastien 我的答案仍然适用于 ``'\xf3'` 但我正在运行 python 3【参考方案3】:

您可以使用dropna()

df['col4'] = df.apply(lambda row: '*'.join(row.dropna()), axis=1)

更新:

由于数字和特殊字符也需要转换,所以可以使用astype(unicode)

In [37]: df = pd.DataFrame('col1': ["a", "b"], 'col2': ["ab", np.nan], "col3": [3, u'\xf3'])

In [38]: df.apply(lambda row: '*'.join(row.dropna().astype(unicode)), axis=1)
Out[38]: 
0    a*ab*3
1       b*ó
dtype: object

In [39]: df['col4'] = df.apply(lambda row: '*'.join(row.dropna().astype(unicode)), axis=1)

In [40]: df
Out[40]: 
  col1 col2 col3    col4
0    a   ab    3  a*ab*3
1    b  NaN    ó     b*ó

【讨论】:

【参考方案4】:
df.apply(lambda row: '*'.join(row.dropna()), axis=1)

【讨论】:

【参考方案5】:
for row in xrange(len(df)):
    s = '*'.join(df.ix[row].dropna().tolist())
    print s

【讨论】:

以上是关于使用分隔符 pandas python 将单元格连接成字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义单元格连接到 UIViewController?

UIViewController 中的 UITableView - 将单元格连接到 UIViewController

使用 pandas 的 df.to_csv 方法不适用于空格作为分隔符

使用 python 和 pandas 将错误创建的大型 csv 文件转换为制表符分隔文件

Python:从列表中删除逗号,以便我可以使用 pandas 将数据导入 Excel 中的单独单元格

pandas 将excel中的一列文本数据拆分成多列 如何操作