我目前正在使用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')
由于
答案 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)))