用python填充两个for循环和if条件的数据帧

时间:2016-12-20 14:31:37

标签: python pandas dataframe

我有两个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数组。 尝试了类似问题的一些建议,到目前为止没有任何成果。

热烈欢迎任何改善我的问题的建议(这是我的第一个问题)。

2 个答案:

答案 0 :(得分:5)

您可以这样做:

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

答案 1 :(得分:3)

stack df2fillna df1

idx = pd.Index(np.unique(df1[['x', 'y']]))
df2 = pd.DataFrame(index=idx, columns=idx)

df2.stack(dropna=False).fillna(df1.set_index(['x', 'y']).Counts) \
    .unstack().fillna(0).astype(int)

   a  b  c  d
a  0  1  3  0
b  0  0  2  0
c  0  0  0  1
d  0  0  0  0