Python将添加新列,该列将具有多个列值和列名

Python将添加新列,该列将具有多个列值和列名,python,pandas,Python,Pandas,我目前正在使用csv文件和pandas模块自动化SQL脚本。其中条件基于我的csv文件上的值 示例csv文件如下所示 First Last X A Y B Z C 我想要一个新的dataframe,它应该是这样的(添加了新的列) 因此,我可以在SQLWHERE条件中使用第三列 注: 我可以通过下面的方法实现这一点,但我不能使用它,因为我的列名不是静态的,我的意思是我将在多个csv/df上使用它,这些csv/df将具有不同的列名,而且列数可能超过2

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

示例csv文件如下所示

First   Last
X        A
Y        B
Z        C
我想要一个新的dataframe,它应该是这样的(添加了新的列)

因此,我可以在SQLWHERE条件中使用第三列

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

谢谢

您可以创建一个函数来完成您的尝试。这将获取任何字符串序列(如您的),并使用序列名称创建所需的模式

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

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

您可以创建一个函数来完成您正在尝试的操作。这将获取任何字符串序列(如您的),并使用序列名称创建所需的模式

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

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

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

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'])
数据:
(因为我使用的字典不必保持顺序,所以我将
第二个
作为最后一个元素;)

结果:

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

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

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'])
数据:
(因为我使用的字典不必保持顺序,所以我将
第二个
作为最后一个元素;)

结果:

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

因此,您只需要一个函数来执行此操作?
df。columns
给出所有列的名称,这样您就可以将它与
for
循环一起使用。@Dmitry Yes它原来是一个函数,我应该按照Furaso的建议应用于dataframe。您只需要一个函数来执行此操作?
df。columns
给出所有列的名称,以便您可以使用它使用
for
循环。@Dmitry Yes它是一个函数,我应该按照furasHi@furas的建议应用到dataframe上,谢谢您的解决方案。我已经接受了你的回答。我还没有尝试,但根据你的解释,我相信它的工作。再次非常感谢。嗨@furas,谢谢你的解决方案。我已经接受了你的回答。我还没有尝试,但根据你的解释,我相信它的工作。再次非常感谢。谢谢@James,我也会检查这个解决方案。谢谢@James,我也会检查这个解决方案。