【问题标题】:Pandas: Join two columns in dataframe (without creating two)熊猫:加入数据框中的两列(不创建两列)
【发布时间】:2015-07-02 06:34:54
【问题描述】:

我有以下数据:

    Col1 Col2 Col3 Col4
     A    G     K
     B          L   Q
     C    H     M
     D          N   R
     E    I     O   
     F    J     P

这就是我想要的:

    Col1 NEW  Col3 
     A    G     K
     B    Q     L   
     C    H     M
     D    R     N   
     E    I     O   
     F    J     P

我尝试过使用following solution,它的工作方式符合我的需要。最终发生的事情是我将拥有数据框 A,然后是数据框 B。B 将包含我的新列,而 A 将保持不变。

我尝试使用 .replace() 和 .fillna() 但我似乎无法正确使用语法。出于某种原因,当我尝试执行以下操作时:

      csv[Col2] = csv.replace(to_replace=" ", value=csv[Col4]])

我最终让 Col4 的全部内容覆盖 Col2(包括空格)。这似乎发生在 .replace() 和 .fillna() 中。

我不确定它是否有帮助,但在这些情况下,Col2 只会丢失 Col4 有数据的数据。有什么想法吗?

解决方案

感谢所有回复的人。我现在意识到,由于语法错误,我一直在追我的尾巴。这是我尝试过但无法正常工作的另一行代码。我遇到了“一列覆盖另一列”的问题(见上文)。

    csv[Col2] = csv.fillna(csv[Col4]])

但是在重新访问下面 John Galt 链接的那个页面后,我觉得我错过了一些东西......然后它像火车一样击中了我。

    csv[Col2] = csv[Col2].fillna(csv[Col4]])

这非常有效。而且我觉得我喜欢密切关注可能会更快地解决这个问题。谢谢大家的病人!

更新一个

我正在附加有关我的数据框的更多信息,以防将来对任何人有所帮助。

    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 50000 entries, 0 to 49999
    Data columns (total 6 columns):
    Col 1                      50000 non-null object
    Col 2                      4652 non-null object
    Col 3                      50000 non-null object
    Col 4                      45347 non-null object
    Col 5                      50000 non-null object
    Col 6                      50000 non-null object
    dtypes: object(6)
    memory usage: 1.5+ MB
    None

【问题讨论】:

  • 空格是空字符串还是nan?你应该可以做到df['NEW'] = df[['Col2', 'Col4']].sum(axis=1)
  • 这个stackoverflow.com/q/29832455/2137255 有帮助吗?
  • 你能用空格替换所有空格吗:df['Col2'] = df['Col2'].str.replace(' ','') 并为 Col4 做同样的事情,然后我之前的评论应该可以工作
  • 抱歉耽搁了。 @EdChum,我相信它们只是空白。如果我将数据框导出到 CSV,则单元格显示为空。如果我将其编入索引然后将其导出为 CSV,我将看到 NAN 值。话虽如此,我尝试了您的解决方案并最终得到“无法连接'str'和'int'对象”。我觉得这可能部分是我的错,因为我的例子只显示了字符串。当我试图用另一列填充空单元格时,我觉得实际数据并不重要。
  • 你能发布有代表性的数据吗,因为现在是x y problem

标签: python csv pandas


【解决方案1】:

为避免创建任何新的临时变量或数据框,您可以将“Col2”替换为新值,然后删除“Col4”。有几种方法可以做到这一点。

Numpy where() 在这里是一个很好的通用解决方案,可以处理''(空或空白)、' '(空格)或nan

df['Col2'] = np.where( df.Col2 == ' ',   df.Col4, df.Col2 )  # space

df['Col2'] = np.where( df.Col2.isnull(), df.Col4, df.Col2 )  # blank or nan 

@EdChum 的答案也应该有效,fillna() 可能是最简单的(如@JohnGalt 的链接中所示),但如果您在那里有空格字符,则不会有效。

df['Col2'] = df['Col2'].fillna(df.Col4)

之后,只需放下 'Col4'

df = df.drop('Col4',axis=1)

【讨论】:

  • 将此标记为答案,因为它整合了所有解决方案。我觉得我欠社区至少测试了所有三个解决方案。我能够使用 Numpy 解决方案以及 .fillna() 获得所需的结果(在使用正确的语法之后)。我觉得 EdChum 的解决方案似乎适用于不同的数据集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 2018-10-28
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多