填充pandas DataFrame

时间:2015-05-07 11:40:29

标签: python pandas dataframe

我有一个数据框df

    AuthorID  Year  citations
0          1  1995         86
1          2  1995         22
2          3  1995         22
3          4  1995         22
4          5  1995         36
5          6  1995         25

我创建的另一个数据框并将其全部初始化为零df2,其中每个索引代表来自AuthorID的{​​{1}}:

df

现在我要做的是遍历 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 并将引文值添加到第二个矩阵中的正确位置。因此,如果我根据上面的内容填写df,它将如下所示:

df2

这很简单。

现在我所做的是以下内容:

         1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  
1           0     86     0     0     0     0     0     0     0     0     0   
2           0     22     0     0     0     0     0     0     0     0     0   
3           0     22     0     0     0     0     0     0     0     0     0   
4           0     36     0     0     0     0     0     0     0     0     0   
5           0     25     0     0     0     0     0     0     0     0     0   
6           0     0     0     0     0     0     0     0     0     0     0   

但它一直给我以下内容:

for index, row in df.iterrows():
     df2.iloc[row[0]][row[1]] = df2.iloc[row[0]][row[1]] + row[2]

所以我试过了:

IndexError: index out of bounds  

它给了我:

for index, row in df.iterrows():
     df2.at[row[0], row[1]] = df2.at[row[0], row[1]] + row[2]

我也试过了ValueError: At based indexing on an non-integer index can only have non-integer indexers ,但这也行不通。

不确定我做错了什么。当我检查df.iat时,他们都返回df.dtypes

2 个答案:

答案 0 :(得分:1)

为什么你不能像这样转动第一个数据框

>> df.pivot(index='AuthorID', columns='Year', values='citations')

这将带来所有年份,因为列和索引将是您的AuthorID

答案 1 :(得分:1)

所以,这里有很长的路可以做你想做的事情:为每个AuthorID分配1/5到1995年以外的其他年份。

x是您的数据框架。

我们将为下面的每个AuthorID添加年份:1996年,1997年和1998年,并存储在y数据框中。

y = pd.DataFrame([[i, y, 0] for y in [1996,1997,1998] for i in x.AuthorID], columns=['AuthorID','Year','citations'])
z = x.append(y)

下面,我们将为同一作者的所有其他年份分配1995年引用的1/3值。

for id in z['AuthorID'].unique():
    condition = (z['AuthorID']==id) & (z['Year']>1995)
    citation2 = (z.loc[(z['Year']==1995) & (z['AuthorID']==id),'citations']/3).values
    z['citations'][condition] = citation2

In [1541]: z.pivot(index='AuthorID', columns='Year', values='citations')
Out[1541]: 
Year      1995       1996       1997       1998
AuthorID                                       
1           86  28.666667  28.666667  28.666667
2           22   7.333333   7.333333   7.333333
3           22   7.333333   7.333333   7.333333
4           22   7.333333   7.333333   7.333333
5           36  12.000000  12.000000  12.000000
6           25   8.333333   8.333333   8.333333