我有以下python代码
sheet_a = pd.read_excel(open('c:\\upload\\' + f,'rb'), skiprows=1, sheetname='a')
sheet_b = pd.read_excel(open('c:\\upload\\' + f,'rb'), skiprows=1, sheetname='b')
在这两张纸中,我从头开始创建了两列Team
和Full Name
。所有行的团队名称都相同,所以:
sheet_a['Team'] = "Team A"
sheet_b['Team'] = "Team B"
但我无法弄清楚如何逐行创建一个值。为了填充每个用户的Full Name
列,我尝试将First Name
列加入同一行的Last Name
列,以创建Bob Smith
来自Bob
和Smith
:
sheet_a['Full Name'] = row['First Name'] + ' ' + row['Last Name']
sheet_b['Full Name'] = row['First Name'] + ' ' + row['Last Name']
然后我完成了以下事情:
sheets = [ sheet_a, sheet_b ]
all_sheets = pd.concat(sheets,ignore_index=True).drop_duplicates().reset_index(drop=True)
all_sheets.to_csv('c:\\upload\\temp2.csv', columns=fields, index=False, sep=',', encoding='utf-8')
Team
列/行的创建工作正常,但我尝试逐行创建Full Name
时出现以下错误:
Traceback (most recent call last):
File "test.py", line 77, in <module>
sheet_a['Full Name'] = row['First Name'] + ' ' + row['Last Name']
NameError: name 'row' is not defined
除了逐行连接之外,脚本中的其他所有内容都可以正常运行。
答案 0 :(得分:3)
这应该有效:
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'First Name': ['Harry', 'Hermione'], 'Last Name': ['P
...: otter', 'Granger']})
In [3]: df
Out[3]:
First Name Last Name
0 Harry Potter
1 Hermione Granger
In [4]: df['Full Name'] = df['First Name'] + ' ' + df['Last Name']
In [5]: df
Out[5]:
First Name Last Name Full Name
0 Harry Potter Harry Potter
1 Hermione Granger Hermione Granger
这里的诀窍是,您可以使用DataFrame
之类的内容来引用现有sheet_a['First Name']
中的整个列,该列提供了一列名字。然后,您可以将名字列连接到姓氏列,并获得一个全名列。
答案 1 :(得分:1)
@Oliver的回答非常好。但在类似情况下,了解pandas.DataFrame.apply()
方法很有用。在这种情况下它会像这样使用:
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({"First Name":["Harry", "Hermione"], "Last Name":["Potter",
...: "Granger"]})
In [3]: df
Out[3]:
First Name Last Name
0 Harry Potter
1 Hermione Granger
In [4]: def concat_name(row):
...: return row["First Name"] + " " + row["Last Name"]
...:
In [5]: df["Full Name"] = df.apply(concat_name, axis=1)
In [6]: df
Out[6]:
First Name Last Name Full Name
0 Harry Potter Harry Potter
1 Hermione Granger Hermione Granger
不是编写自己的函数,当然可以引入lambda&#39>
In [7]: df["Full Name"] = df.apply(lambda row: " ".join(row[["First Name", "Last Name
...: "]]), axis=1)
哪个可能更具可读性。只需在axis=1
方法中注意apply
,迭代行而不是列,这是我认为的默认值。 apply
很有用,因为你可以编写非常复杂的函数。