pandas逐行填充创建的工作表

时间:2016-11-17 20:13:39

标签: python pandas

我有以下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')

在这两张纸中,我从头开始创建了两列TeamFull Name。所有行的团队名称都相同,所以:

sheet_a['Team'] = "Team A"
sheet_b['Team'] = "Team B"

但我无法弄清楚如何逐行创建一个值。为了填充每个用户的Full Name列,我尝试将First Name列加入同一行的Last Name列,以创建Bob Smith来自BobSmith

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

除了逐行连接之外,脚本中的其他所有内容都可以正常运行。

2 个答案:

答案 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很有用,因为你可以编写非常复杂的函数。