Python Pandas添加了新列,它将具有多个列值以及列名

时间:2017-01-27 00:47:12

标签: python pandas

我目前正在使用csv文件和pandas模块自动化SQL脚本。其中condition是基于我的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中使用条件的第三列。

注意: 我可以通过下面的方法来实现这个,但我不能使用它,因为我的列名不是静态的,我的意思是我将在多个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')

由于

2 个答案:

答案 0 :(得分:3)

您可以将apply与行(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

答案 1 :(得分:0)

您可以创建一个功能来完成您的尝试。这将采用任何字符串系列(例如您的系列)并使用系列名称创建所需的模式。

避免明确命名列是困难的部分。

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)))