如何使用数据帧中的数据将三角矩阵构建为df



假设:我有这样的数据帧:

import pandas as pd
df = pd.DataFrame({'a':['a1','a2','a3','a4','a5'],'b':[1,2,3,4,5]})

输出:

a  b
0  a1  1
1  a2  2
2  a3  3
3  a4  4
4  a5  5

现在我想添加对应于a1a2a3a4a5的新列

for index, row in df.iterrows():
df[index] = np.NaN

输出:

a  b   0   1   2   3   4
0  a1  1 NaN NaN NaN NaN NaN
1  a2  2 NaN NaN NaN NaN NaN
2  a3  3 NaN NaN NaN NaN NaN
3  a4  4 NaN NaN NaN NaN NaN
4  a5  5 NaN NaN NaN NaN NaN

如何在数据帧中生成三角矩阵?

我想要以下输出:

a  b 0   1   2   3   4
0  a1  1 a1  a2  a3  a4  a5
1  a2  2 NaN a2  a3  a4  a5
2  a3  3 NaN NaN a3  a4  a5
3  a4  4 NaN NaN NaN a4  a5
4  a5  5 NaN NaN NaN NaN a5

我是否应该将一个额外的数据帧构建为三角矩阵,然后进行合并?最简单的方法是什么?

这将起作用:

for i in range(df.shape[0]):
df.iloc[i, i+2:] = df['a'][i:]

输出:

>>> df
a  b   0   1   2   3   4
0  a1  1 NaN NaN NaN NaN NaN
1  a2  2 NaN NaN NaN NaN NaN
2  a3  3 NaN NaN NaN NaN NaN
3  a4  4 NaN NaN NaN NaN NaN
4  a5  5 NaN NaN NaN NaN NaN
>>> for i in range(df.shape[0]):
...    df.iloc[i, i+2:] = df['a'][i:]
>>> df
a  b    0    1    2    3   4
0  a1  1   a1   a2   a3   a4  a5
1  a2  2  NaN   a2   a3   a4  a5
2  a3  3  NaN  NaN   a3   a4  a5
3  a4  4  NaN  NaN  NaN   a4  a5
4  a5  5  NaN  NaN  NaN  NaN  a5

一种有效的方法是使用numpy(numpy.tilenumpy.triu(:

import numpy as np
np.triu(np.tile(df['a'].values, (len(df), 1)))

然后制作一个数据帧并加入:

df.join(pd.DataFrame(np.triu(np.tile(df['a'].values, (len(df), 1))),
index=df.index
).replace({0: pd.NA}))

输出:

a  b     0     1     2     3   4
0  a1  1    a1    a2    a3    a4  a5
1  a2  2  <NA>    a2    a3    a4  a5
2  a3  3  <NA>  <NA>    a3    a4  a5
3  a4  4  <NA>  <NA>  <NA>    a4  a5
4  a5  5  <NA>  <NA>  <NA>  <NA>  a5
替代方案
n = len(df)
df.join(pd.DataFrame(np.tile(df['a'].values, (n, 1)), index=df.index
).where(np.triu(np.ones((n, n))).astype(bool)))

输出:

a  b    0    1    2    3   4
0  a1  1   a1   a2   a3   a4  a5
1  a2  2  NaN   a2   a3   a4  a5
2  a3  3  NaN  NaN   a3   a4  a5
3  a4  4  NaN  NaN  NaN   a4  a5
4  a5  5  NaN  NaN  NaN  NaN  a5

我的解决方案类似于mozway,但不包括3个步骤:(

import pandas as pd
import numpy as np
d = { "a":['a1','a2','a3','a4','a5']  }
"create dataframe from dict"
df = pd.DataFrame(d)
indek1 = list(df.index)
column1 = df['a'].values
lista_tot = []
for k in indek1:
lista_tot.append(column1)
a = np.triu(lista_tot, 0)
df1 = pd.DataFrame(a)
print(df1)
df = df.join(df1)
print(df)

最新更新