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

在python中用两个for循环和if条件填充数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧,其中一个看起来像这样: df1: 另一个在前两列中都有作为索引和作为列的唯一值列表: df2 我想做的是用第一个数据框中的值填充第二个数据框,因为列和索引的交点与第一个数据框中的行相同,例如: 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循环时,它会导致计算机阻塞(假设一个真实的数据帧包含1000多行) 我试图

我有两个数据帧,其中一个看起来像这样:

df1:

另一个在前两列中都有作为索引和作为列的唯一值列表:

df2

我想做的是用第一个数据框中的值填充第二个数据框,因为列和索引的交点与第一个数据框中的行相同,例如:

   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循环时,它会导致计算机阻塞(假设一个真实的数据帧包含1000多行)

我试图实现的代码片段(这使得计算机显然无法执行“沉重”的计算):

重要的是要注意,唯一值列表(即第二个数据帧中的索引和列)比第一列中的行数长,在我的示例中,它们重合

如果有任何关联,第一个数据框基本上表示第一列和第二列中单词的组合及其在文本中的出现。引用基本上是边的权重。 所以,我试图创建一个矩阵,以便通过igraph绘制一个图。我选择首先创建一个DataFrame,然后将其值作为数组传递给igraph。 据我所知,pythonigraph不能使用dataframe来绘制一个图,它只是一个numpy数组。 尝试了一些针对类似问题的解决方案,到目前为止没有任何结果


欢迎提出任何改进我的问题的建议(这是我在这里的第一个问题)。

您可以这样做:

输出:

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

stack
df2
fillna
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

你知道蓝色的面罩是做什么用的吗?我也有,我不知道,这让我很困扰。:-)@piRSquared是的,蓝色部分应该适合脸(顾名思义:脸上的蓝色),但它有点大。如果你试着穿它,我想最适合的是灰色锥形的尖边缘应该在鼻子的中间。点击面具,拖动它并在某张脸上重叠。谢谢你,穆罕默德!它确实起作用了,但是这个解决方案(pivot)使我“松动”了一些我不应该松动的值,例如“a”作为列,“d”作为行。虽然这些值是以另一种方式显示的(整个数据帧是对称的),但我必须有一个方阵。我曾想过手动添加“缺少的”行和列,但这又一次需要太多时间。@NellyM piRSquared的解决方案对您很有用。只需在NaN中填入零即可。@NellyM修改了我的解决方案。顺便问一下,看看它是否对你有用。这真是太愚蠢了。我脑子里想不出你刚才在这里做了什么。也许我会打印并查看所有部分。:)谢谢你,@piRSquared!它看起来正是我所需要的,但在实践中,我得到的整个数据帧只填充了NaN值。在真实数据集上检查了两次,然后尝试了一个“小”示例,一个有4行和4列的示例,我再次得到了所有的NaN值。“我想不出我遗漏了什么。”我会检查我的解决方案。它现在可以工作,但是如果x和y没有在原始数据帧中排序,它会失败吗?
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
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
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