【问题标题】:Python Pandas add new column which will have multiple columns values along with column namesPython Pandas 添加新列,该列将具有多个列值以及列名
【发布时间】:2017-01-27 09:49:05
【问题描述】:

我目前正在使用 csv 文件和 pandas 模块自动执行 SQL 脚本。其中条件基于我的 csv 文件中存在的值。

示例 csv 文件如下所示。

First   Last
X        A
Y        B
Z        C

我想要一个看起来像这样的新数据框(添加了新列)。

First   Last          condition
X        A     First='X' and Last='A'
Y        B     First='Y' and Last='B'
Z        C     First='Z' and Last='C'

所以我可以在我的 sql where 条件中使用第三列。

注意: 我可以通过下面的方法实现这一点,但我不能使用它,因为我的列名不是静态的,我的意思是我将在具有不同列名的多个 csv/df 上使用它,数字列也可能超过 2。

df['condition'] = 'First=\'' + df['First'] +'\' And ' + 'Last=\'' + df['Last'] +'\''

如果我解析了“条件”列,那么我的最终 SQL 将如下所示:

Select First, Last from mydb.customers
where
(First='X' and Last='A') or
(First='Y' and Last='B') or
(First='Z' and Last='C')

谢谢

【问题讨论】:

  • 所以你只想要一个能做到这一点的函数?
  • df.columns 给出所有列的名称,以便您可以将其与for 循环一起使用。
  • @Dmitry 是的,事实证明这是一个函数,我应该按照 furas 的建议将其应用于数据帧

标签: python pandas


【解决方案1】:

您可以使用apply with row (axis=1) 对每一行执行函数 - 此函数获取有关行中数据的所有信息 - 列名和值

import pandas as pd

df = pd.DataFrame({
        'First': ['X', 'Y', 'Z'],
        'Second': ['1', '2', '3'],
        'Last': ['A', 'B', 'C'],
    })

print(df)

def concatenate(row):
    parts = []

    for name, value in row.items():
        parts.append("{}='{}'".format(name, value))

    return ' and '.join(parts)


df['condition'] = df.apply(concatenate, axis=1)

print(df['condition'])

数据:
(因为我使用了不需要保持顺序的字典,所以我得到Second 作为最后一个元素;))

  First Last Second
0     X    A      1
1     Y    B      2
2     Z    C      3

结果:

0    First='X' and Last='A' and Second='1'
1    First='Y' and Last='B' and Second='2'
2    First='Z' and Last='C' and Second='3'
Name: condition, dtype: object

【讨论】:

  • 嗨@furas,谢谢你的解决方案。我已经接受了你的回答。我还没有尝试过,但根据你的解释,我确信它有效。再次非常感谢。
【解决方案2】:

你可以创建一个函数来完成你正在尝试的事情。这需要任何字符串系列(例如您的)并使用系列名称创建您想要的模式。

避免显式命名列是困难的部分。

from functools import reduce  #for python 3, it is native in 2

def series_to_str(s):
    n = s.name
    return n+"='" + s +"'"

df['condition'] = reduce(lambda x, y: x+' and '+y, 
                         map(series_namer, (df[col] for col in df)))

【讨论】:

  • 谢谢@James,我也会检查这个解决方案。
猜你喜欢
  • 2019-04-26
  • 1970-01-01
  • 2019-10-20
  • 2021-08-27
  • 2016-04-12
  • 2022-01-26
  • 2019-05-30
  • 1970-01-01
  • 2017-08-29
相关资源
最近更新 更多