我有一个数据框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
答案 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