将Pandas数据框列添加到新的数据框中
我在用Pandas处理一些数据,想把这些数据添加到我的“results”数据框里。也就是说,我有
naics = someData
这个数据可能长这样
indnaics ind1990
89 81393 873
不过,它可能有多行。我想把这些数据和一个叫做year的变量一起添加到我的results
数据框里。如果有多行的话,所有行的year
值应该是一样的。这是我目前尝试的代码
for job in jobs:
df2 = iGetThisFromJob()
years = df2.year.unique()
naics = iGetThisFromJob()
if len(naics) == 0:
continue
for year in years:
wages = df2.incwage[df2.year == year]
# Add all the data to results, this is how I try it
rows = pd.DataFrame([dict(year=year, incwage=mean(wages), )])
# I also want to add the column indnaics from my naics
rows['naics'] = naics.indnaics
results = results.append(rows, ignore_index=True)
但是,尽管naics.indnaics里有数据,我还是无法用这种方式把它添加到rows对象里。
naics.indnaics
Out[1052]:
89 81393
rows['naics'] = naics.indnaics rows
Out[1051]:
incwage year naics
0 45853.061224 2002 NaN
如果我的代码还有其他问题,请告诉我。我刚开始学习Pandas。
谢谢!
/编辑
期望的输出:
incwage year naics
0 45853.061224 2002 81393
0 45853.061224 2002 12312
/编辑
建议的解决方案:
index = arange(0, len(naics))
columns = ['year', 'incwage', 'naics']
rows = pd.DataFrame(index=index, columns=columns)
rows.year = year
rows.incwage = mean(wages)
rows.naics = naics.indnaics.values
1 个回答
2
你得到NaN值的原因是因为索引不匹配。在这段代码中,rows['naics'] = naics.indnaics
,rows
的索引是0,而naics.indnaics
的索引是89,所以在赋值的时候会尝试对齐这些索引。
你可以通过只取值来解决这个问题,比如使用naics.indnaics.values
。下面是一个简单的例子:
In [30]: df = pd.DataFrame({'A':[0], 'B':[1]})
In [31]: df
Out[31]:
A B
0 0 1
In [32]: s = pd.Series([2], index=[83])
In [33]: s
Out[33]:
83 2
dtype: int64
In [35]: df['new_column'] = s
In [36]: df
Out[36]:
A B new_column
0 0 1 NaN
In [37]: df['new_column'] = s.values
In [38]: df
Out[38]:
A B new_column
0 0 1 2
如果你想添加的序列可能有更多的值,有几种方法可以做到。我想到的有:
比如先把数据框的索引调整到和序列的长度一致:
In [75]: s
Out[75]:
83 2
84 4
dtype: int64
In [76]: df
Out[76]:
A B
0 0 1
In [77]: df = df.reindex(np.zeros(len(s)))
In [78]: df
Out[78]:
A B
0 0 1
0 0 1
In [79]: df['new_column'] = s.values
In [80]: df
Out[80]:
A B new_column
0 0 1 2
0 0 1 4
或者反过来,把数据框添加到序列(你需要先把序列转换成数据框):
In [90]: ss = s.to_frame().set_index(np.array([0,0]))
In [91]: ss[df.columns] = df
In [92]: ss
Out[92]:
0 A B
0 2 0 1
0 4 0 1
[2 rows x 3 columns]