我有两个 DataFrame,一个看起来像这样:
df1:
x y Counts
a b 1
a c 3
b c 2
c d 1
另一个将前两列中的唯一值列表作为索引和列:
df2
a b c d
a
b
c
d
我想做的是用第一个 DataFrame 的值填充第二个 DataFrame,因为列和索引的交集是第一个 DataFrame 的同一行,例如:
a b c d
a 0 1 3 0
b 1 0 2 0
c 3 2 0 1
d 0 0 1 0
虽然我尝试使用两个带有双 if 条件的 for 循环,但它会使计算机阻塞(假设一个真正的 DataFrame 包含超过 1000 行)。
我正在尝试实现的代码片段(这使得计算机执行的计算显然太“繁重”):
for i in df2.index:
for j in df2.columns:
if (i==df1.x.any() and j==df1.y.any()):
df2.loc[i,j]=df1.Counts
重要的是要注意,唯一值列表(即第二个 DataFrame 中的索引和列)比第一列中的行数长,在我的示例中它们是重合的。
如果有任何相关性,第一个数据框基本上表示第一列和第二列中的单词组合以及它们在文本中的出现。发生次数基本上是边的权重。 所以,我正在尝试创建一个矩阵,以便通过 igraph 绘制图形。我选择首先创建一个 DataFrame,然后将其值作为数组传递给 igraph。 据我所知,python-igraph 不能使用数据框来绘制图形,只能是一个 numpy 数组。 尝试了针对类似问题建议的一些解决方案,但到目前为止还没有解决。
热烈欢迎任何改进我的问题的建议(这是我的第一个问题)。
最佳答案
你可以这样做:
import pandas as pd
#df = pd.read_clipboard()
#df2 = df.copy()
df3=df2.pivot(index='x',columns='y',values='Counts')
print df3
print
new=sorted((set(df3.columns.tolist()+df3.index.tolist())))
df3 = df3.reindex(new,columns=new).fillna(0).applymap(int)
print df3
输出:
y b c d
x
a 1.0 3.0 NaN
b NaN 2.0 NaN
c NaN NaN 1.0
y a b c d
x
a 0 1 3 0
b 0 0 2 0
c 0 0 0 1
d 0 0 0 0
关于python - 用两个for循环和python中的条件填充数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41244681/