将Pandas数据框列添加到新的数据框中

0 投票
1 回答
9038 浏览
提问于 2025-04-18 03:23

我在用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.indnaicsrows的索引是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]

撰写回答