【问题标题】:Pandas Sum DataFrame Columns of various typesPandas Sum DataFrame 各种类型的列
【发布时间】:2018-08-08 15:28:18
【问题描述】:

我正在尝试连接 Pandas DataFrame 的两列:

df = pd.DataFrame({'A': [2, 1, 3, 4], 'B': ['a', 'b', 'c', 'd']})

(格式化):

   A  B
0  2  a
1  1  b
2  3  c
3  4  d

尝试sum([df[column] for column in df]) 不起作用,显然是因为您无法将整数(列A)添加到字符串(列B)。

所以我添加了以下几行:

for column in df1:
    df1[column] = df1[column].apply(str)

为了确保字符串转换工作正常,我添加了以下语句:

print([df[column].apply(type) for column in df])

哪个产生

In : print([df[column].apply(type) for column in df])

Out:
[0    <class 'str'>
1    <class 'str'>
2    <class 'str'>
3    <class 'str'>
Name: A, dtype: object, 0    <class 'str'>
1    <class 'str'>
2    <class 'str'>
3    <class 'str'>
Name: B, dtype: object]

但是仍然,当我运行sum([df[column] for column in df]) 时,我收到错误TypeError: unsupported operand type(s) for +: 'int' and 'str'

发生了什么事?

【问题讨论】:

  • “连接”是指字符串连接列以生成一系列字符串
  • 预期的输出应该是包含元素“2a”、“1b”、“3c”、“4d”的熊猫系列。我不担心列标题。

标签: python python-3.x pandas tostring


【解决方案1】:

IIUC,您可以像这样连接您的列:

df.astype(str).sum(axis=1)

0    2a
1    1b
2    3c
3    4d
dtype: object

这会将所有列转换为类型 str (df.astype(str)),然后使用 sum 逐行连接 (axis=1)

【讨论】:

  • 这个又快又简单,++1
【解决方案2】:

使用

In [99]: df.A.astype(str) + df.B
Out[99]:
0    2a
1    1b
2    3c
3    4d
dtype: object

替代方案,使用apply,可能会很慢。

In [106]: df.apply(lambda x: '{A}{B}'.format(**x), axis=1)
Out[106]:
0    2a
1    1b
2    3c
3    4d
dtype: object

@JonClementsformat_map 有一个不错的选择

In [124]: df.apply('{A}{B}'.format_map, axis=1)
Out[124]:
0    2a
1    1b
2    3c
3    4d
dtype: object

【讨论】:

  • 我喜欢这个,但是当我将你的解决方案推广到s = sum([df[column].astype(str) for column in df]) 时,为什么我又得到了不受支持的类型异常?
  • @Zero 你可以在lambda x: '{A}{B}'.format(**x) 上有点厚脸皮,然后在'{A}{B}'.format_map 那里...(避免使用 lambda 和 dict-unpacking 似乎快 10%)
  • @JonClements -- 哦,天哪,不知道format_map,很酷,谢谢。
  • 说真的,我之前写过lambdalambda kw: '{A}{B}'.format(**kw)
【解决方案3】:

如果您对性能感兴趣,请使用 f-strings 和列表推导式。

pd.Series([f'{i}{j}' for i,j in zip(df.A, df.B)])

0    2a
1    1b
2    3c
3    4d
dtype: object

由于 pandas 处理字符串效率低下,相对而言这将是一个非常快的选择。

【讨论】:

  • 使用df.A.valuesdf.B.values 可以节省更多时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
相关资源
最近更新 更多