想象一下我有这个数据框:
test = pd.DataFrame({"id" : [0,1,4,3],
"cit" : [[6,7], [], [9,2,1], [0,1]]})
此DataFrame:
id cit
0 0 [6, 7]
1 1 []
2 4 [9, 2, 1]
3 3 [0, 1]
(实际上,我有一个约13000行的数据框)
cit列是ID(单向)的链接,ID#0具有ID#6和ID#7的链接,ID#1没有链接,ID#4具有#9,#2的链接#1和ID#3的链接具有ID#0和ID#1
如果有链接,如果要链接2个id,我想输入1,否则为0
我想要这个输出:
id 0 1 4 3
0 X 0 0 1
1 0 X 1 1
4 1 1 X 0
3 1 0 0 X
我写了一个代码,但是有2个for循环。 我想优化以下代码:
for i in range(len(test.id)):
tmp = []
for j in range(len(test.cit)):
if test.id.iloc[i] in test.cit.iloc[j]:
tmp.append(str(1))
else:
tmp.append(str(0))
t2.loc[str(test.id.iloc[i])] = tmp
print(i, '/' , len(test.id))
t2.values[[np.arange(len(test.id))]*2] = "X"
而且我不知道如何将DataFrame的上三角形复制到下三角形(我可以使用for循环来完成此操作,但是使用13000行进行4个for循环,这将非常慢。)
我检查了iterrows()和itertuples()函数,但不知道该怎么做,与isin()或apply / map()函数相同。.
预先感谢您的帮助。
答案 0 :(得分:0)
我将创建一个新的DataFrame
,然后您可以使用pd.crosstab
import pandas as pd
df = (pd.DataFrame(test.cit.values.tolist(),
index = test.id)
.stack()
.reset_index(level=1, drop=True)
.to_frame())
pd.crosstab(df.index, df[0].values.astype(int)).rename_axis(None,1).rename_axis('id', 0)
0 1 2 6 7 9
id
0 0 0 0 1 1 0
3 1 1 0 0 0 0
4 0 1 1 0 0 1
如果需要,您可以在以后重新索引以获取所有行或所有列。但是,由于您的预期输出与您提供的数据不匹配,因此不确定是否需要。