对python数据帧的行和列进行递归分组

2024-09-27 19:34:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,表示索引为0到1的行项目与列项目的相似性。 我想对更相似的项进行分组并创建一个新的数据框,方法是删除分组的项行和列,然后添加一个行和列,这两个行和列都使用包含两个合并项的元组进行索引,然后再次执行此过程,直到我对所有项进行分组。 目前,我已经提出了以下代码:

我首先从一个名为gupt_seiff的元组字典中创建了两个数据帧,其中一个保持不变,另一个将被修改:

gupt_seiff_df = pd.DataFrame(index = workshops, columns = workshops)
for el in gupt_seiff:
    gupt_seiff_df.at[el[0], el[1]] = gupt_seiff[el]
gupt_seiff_df2 = pd.DataFrame(index = workshops, columns = workshops)
for row in gupt_seiff_df.index:
    for col in gupt_seiff_df.columns:
        gupt_seiff_df2.at[row, col] = gupt_seiff_df.at[row, col]

这是我打印gupt_seiff_df和gupt_seiff_df2的结果:

              clav acciaio tornio montaggio 3 montaggio 1 tav controllo lavatrice montaggio 2 montaggio 4
clav acciaio           1.0    1.0         0.0         0.0           1.0       1.0         0.0         0.0
tornio                 1.0    1.0         0.0         0.0           1.0       1.0         0.0         0.0
montaggio 3            0.0    0.0         1.0         0.0           0.0       0.0    0.059823    0.075803
montaggio 1            0.0    0.0         0.0         1.0           0.0       0.0    0.019964         0.0
tav controllo          1.0    1.0         0.0         0.0           1.0       1.0         0.0         0.0
lavatrice              1.0    1.0         0.0         0.0           1.0       1.0         0.0         0.0
montaggio 2            0.0    0.0    0.059823    0.019964           0.0       0.0         1.0    0.884966
montaggio 4            0.0    0.0    0.075803         0.0           0.0       0.0    0.884966         1.0
              clav acciaio tornio montaggio 3 montaggio 1 tav controllo lavatrice montaggio 2 montaggio 4
clav acciaio           1.0    1.0         0.0         0.0           1.0       1.0         0.0         0.0
tornio                 1.0    1.0         0.0         0.0           1.0       1.0         0.0         0.0
montaggio 3            0.0    0.0         1.0         0.0           0.0       0.0    0.059823    0.075803
montaggio 1            0.0    0.0         0.0         1.0           0.0       0.0    0.019964         0.0
tav controllo          1.0    1.0         0.0         0.0           1.0       1.0         0.0         0.0
lavatrice              1.0    1.0         0.0         0.0           1.0       1.0         0.0         0.0
montaggio 2            0.0    0.0    0.059823    0.019964           0.0       0.0         1.0    0.884966
montaggio 4            0.0    0.0    0.075803         0.0           0.0       0.0    0.884966         1.0

现在,我想找到具有最大相似性的项,或者数据帧中索引最高的(行、列)对。我设法做到了,唯一值得一提的是,对角线中的值被排除在外,因为它们代表了与一个项目及其本身的相似性,当然是1,如果对角线外有具有相同相似性的对,那么先合并哪对对并不重要,所以我只合并第一对

现在我有一个元组,其中有两个具有最大相似性的项,这将是我的第一个集群。例如:

print(cluster)
('tav controllo', 'lavatrice')

所以在本例中,我要做的是删除名为tav controllo和lavatrice的行和列,并添加一行和一列,索引为('tav controllo','lavatrice')。 预期结果如下:

gupt_seiff_df2 = gupt_seiff_df2.drop(cluster[0], axis=0)
gupt_seiff_df2 = gupt_seiff_df2.drop(cluster[0], axis=1)
gupt_seiff_df2 = gupt_seiff_df2.drop(cluster[1], axis=0)
gupt_seiff_df2 = gupt_seiff_df2.drop(cluster[1], axis=1)
new_row_col = pd.Series({cluster[0] + cluster[1]: 1}, name=cluster[0] + cluster[1])
gupt_seiff_df2 = gupt_seiff_df2.append(new_row_col)
                       clav acciaio montaggio 2 tornio montaggio 3 montaggio 4 montaggio 1  tav controllolavatrice
clav acciaio                    1.0         0.0    1.0         0.0         0.0         0.0                     NaN
montaggio 2                     0.0         1.0    0.0    0.059823    0.884966    0.019964                     NaN
tornio                          1.0         0.0    1.0         0.0         0.0         0.0                     NaN
montaggio 3                     0.0    0.059823    0.0         1.0    0.075803         0.0                     NaN
montaggio 4                     0.0    0.884966    0.0    0.075803         1.0         0.0                     NaN
montaggio 1                     0.0    0.019964    0.0         0.0         0.0         1.0                     NaN
tav controllolavatrice          NaN         NaN    NaN         NaN         NaN         NaN                     1.0

但这里的问题是,只有当我连接项目的字符串名称时,它才起作用。 我想要的是保留集群元组的两个不同元素,因为现在我必须计算集群与其他项的相似性值,例如('tav controllo','lavatrice')与'clav acciao'的相似性将是元组中的项与新项的平均值:

gupt_seiff_df2.at[('tav controllo', 'lavatrice'), 'clav acciaio'] = (gupt_seiff_df.at['tav controllo', 'clav acciaio'] + gupt_seiff_df.at['lavatrice', 'clav acciaio'])/2

依此类推,以填充所有NaN值。 它也可能发生,我必须计算两个元组之间的平均值,因此它将是第一个元组和第二个元组之间所有组合的相似性值的平均值。例如,如果我有一个包含3个项的元组和一个包含2个项的元组,我将有3x2=6个相似性值,然后我将计算平均值

我试图用以下代码保留元组索引:

gupt_seiff_df2 = gupt_seiff_df2.drop(cluster[0], axis=0)
gupt_seiff_df2 = gupt_seiff_df2.drop(cluster[0], axis=1)
gupt_seiff_df2 = gupt_seiff_df2.drop(cluster[1], axis=0)
gupt_seiff_df2 = gupt_seiff_df2.drop(cluster[1], axis=1)
new_row_col = pd.Series({cluster: 1}, name=cluster)
gupt_seiff_df2 = gupt_seiff_df2.append(new_row_col)

但我得到了以下错误:

Traceback (most recent call last):
  File "C:\Users\damia\PycharmProjects\logistic_management_tool\Main_es.py", line 9, in <module>
    plant = Plant(loader_)
  File "C:\Users\damia\PycharmProjects\logistic_management_tool\plant.py", line 168, in __init__
    gupt_seiff_df2 = gupt_seiff_df2.append(new_row_col)
  File "C:\Users\damia\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\frame.py", line 7960, in append
    other.reindex(combined_columns, copy=False)
  File "C:\Users\damia\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\series.py", line 4345, in reindex
    return super().reindex(index=index, **kwargs)
  File "C:\Users\damia\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\generic.py", line 4811, in reindex
    return self._reindex_axes(
  File "C:\Users\damia\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\generic.py", line 4827, in _reindex_axes
    new_index, indexer = ax.reindex(
  File "C:\Users\damia\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\indexes\multi.py", line 2492, in reindex
    target = MultiIndex.from_tuples(target)
  File "C:\Users\damia\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\indexes\multi.py", line 175, in new_meth
    return meth(self_or_cls, *args, **kwargs)
  File "C:\Users\damia\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\indexes\multi.py", line 531, in from_tuples
    arrays = list(lib.tuples_to_object_array(tuples).T)
  File "pandas\_libs\lib.pyx", line 2537, in pandas._libs.lib.tuples_to_object_array
TypeError: Expected tuple, got str

最后,我想用新的gupt_seiff_df2重复这个过程。最终结果必须是一个1x1数据帧,索引所有项目的集群:

cluster_all_items = (clav acciaio, tornio, montaggio 3, montaggio 1, tav controllo, lavatrice, montaggio 2, montaggio 4)

                    (cluster_all_items)

(cluster_all_items)         1

Tags: inlinenanfile元组clusterdf2tav
1条回答
网友
1楼 · 发布于 2024-09-27 19:34:12

我想你还在寻找解决办法

我认为.append的问题源于对索引的误解。元组最有可能导致一个MultiIndex,然后与数据帧的标签冲突(我已经查看了相应的Pandas实现,但最终丢失了)。这里有一个不错的解决方法:

使用示例框架

df = pd.DataFrame({'A': [1, 2], 'B': [2, 1]}, index=['A', 'B'])
   A  B
A  1  2
B  2  1

这个

cluster = ('A', 'B')
df = df.append(pd.Series({cluster: 1}, name=cluster))

由于同样的原因失败了,但是

cluster = ('A', 'B')
df = pd.concat([df, pd.Series({cluster: 1})])
df.columns = df.columns.to_list()[:-1] + [cluster]

结果(print(df))在

          A    B  (A, B)
A       1.0  2.0     NaN
B       2.0  1.0     NaN
(A, B)  NaN  NaN     1.0

似乎有你想要的结构

也许有帮助

相关问题 更多 >

    热门问题