对于具有多行的pandas DataFrame中的列,我想创建一个新列,该列具有指定行数的行,这些行形成前一列行的子级别。我尝试这样做是为了创建一个包含值范围的大数据矩阵作为模型的输入。
作为一个例子,我有一个小的DataFrame,如下所示:
df:
A
1 1
2 2
3 3
. ..
对于这个DataFrame,我想在' A'中添加每行3行。 DataFrame的列,形成一个名为' B'的新列。结果应该是这样的:
df:
A B
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 2 3
7 3 1
8 3 2
9 3 3
. .. ..
我尝试了各种各样的事情,其中列表理解与if
语句相结合,并使用某些东西迭代DataFrame中的行,如iterrows()
,然后追加'新行对我来说似乎是最合乎逻辑的,但我无法完成它。尤其是“A'”的重复。列的行。
有谁知道怎么做?
任何建议都表示赞赏,非常感谢提前
答案 0 :(得分:2)
我认为您需要numpy.repeat
和numpy.tile
与DataFrame
构造函数:
df = pd.DataFrame({'A':np.repeat(df['A'].values, 3),
'B':np.tile(df['A'].values, 3)})
print (df)
A B
0 1 1
1 1 2
2 1 3
3 2 1
4 2 2
5 2 3
6 3 1
7 3 2
8 3 3
答案 1 :(得分:2)
In [28]: pd.DataFrame({'A':np.repeat(df.A.values, 3), 'B':np.tile(df.A.values,3)})
Out[28]:
A B
0 1 1
1 1 2
2 1 3
3 2 1
4 2 2
5 2 3
6 3 1
7 3 2
8 3 3
答案 2 :(得分:1)
这是另一种NumPy方法,np.repeat
创建一个列,然后将其重新用于另一个列 -
In [282]: df.A
Out[282]:
1 4
2 9
3 5
Name: A, dtype: int64
In [288]: r = np.repeat(df.A.values[:,None],3,axis=1)
In [289]: pd.DataFrame(np.c_[r.ravel(), r.T.ravel()], columns=[['A','B']])
Out[289]:
A B
0 4 4
1 4 9
2 4 5
3 9 4
4 9 9
5 9 5
6 5 4
7 5 9
8 5 5