首页 > 解决方案 > 将 index 的值与列名进行比较;蟒蛇熊猫

问题描述

嗨,我有两个 Dataframe,如下所示

df1 = pd.DataFrame.from_dict(({"Column":{"0":"A","1":"B","2":"C","3":"A"},"Column2":{"0":"T1","1":"T2","2":"T1","3":"T1"}}))

df1

然后我使用下面的语句创建了另一个数据框

df2 = pd.DataFrame(np.zeros(shape=(df1.shape[0],df1.shape[0])), columns=df1['Column'].values, index=df1['Column'].values)

df2

现在我需要更新 df2 好像索引等于列然后分配值 1 如果索引不等于列然后检查 df1 如果该索引和列值 column2 值匹配然后分配值 2 否则分配 3

预期结果:

结果

我们可以在不使用 for 循环的情况下实现它吗?

注意: df1 的形状和值每次都可以不同,

标签: pythonpandasdataframe

解决方案


利用:

# STEP 1
df1 = df1.set_index(df1['Column'] + '_' + df1.groupby('Column').cumcount().astype(str))
df2 = pd.DataFrame(np.zeros(shape=(df1.shape[0],df1.shape[0])), columns=df1.index, index=df1.index)

# STEP 2
df2 = df2.reset_index().melt('index', var_name='column')

# STEP 3:
m1 =  df2['index'].str.replace(r'(_\d+)$', '').eq(df2['column'].str.replace(r'(_\d+)$', ''))

# STEP 4
m2 = df1.lookup(df2['index'], ['Column2']*df2.shape[0]) == df1.lookup(df2['column'], ['Column2'] * df2.shape[0])

# STEP 5
df2['value'] = np.select([m1, m2], [1, 2], 3)

# STEP 6:
df2 = df2.pivot('index', 'column', 'value').rename_axis(index=None, columns=None)

# STEP 7: RESULT
df2 = df2.reindex(index=df1.index, columns=df1.index)
df2.index = df2.index.str.replace(r'(_\d+)$', '')
df2.columns = df2.columns.str.replace(r'(_\d+)$', '')

脚步:

步骤 1:由于原始数据帧包含重复值,我们可以使用 use df.groupbyonColumn和 use cumcountand concatenate it withdf['Column']df1. 然后我们可以df2从 dataframe 初始化新的 dataframe df1

# STEP 1
# print(df2)
     A_0  B_0  C_0  A_1
A_0  0.0  0.0  0.0  0.0
B_0  0.0  0.0  0.0  0.0
C_0  0.0  0.0  0.0  0.0
A_1  0.0  0.0  0.0  0.0

第 2 步:DataFrame.melt用于取消透视数据框。

# STEP 2
# print(df2)
   index column  value
0    A_0    A_0    0.0
1    B_0    A_0    0.0
2    C_0    A_0    0.0
3    A_1    A_0    0.0
4    A_0    B_0    0.0
5    B_0    B_0    0.0
6    C_0    B_0    0.0
7    A_1    B_0    0.0
8    A_0    C_0    0.0
9    B_0    C_0    0.0
10   C_0    C_0    0.0
11   A_1    C_0    0.0
12   A_0    A_1    0.0
13   B_0    A_1    0.0
14   C_0    A_1    0.0
15   A_1    A_1    0.0

第 3 步:使用Series.equals创建一个布尔掩码m1,它对应于indexindf2等于columnin的条件df2

# STEP 3
# print(m1)
[True, False, False, True, False, True, False, False, False, False, True, False, True, False, False, True]

第 4 步:DataFrame.lookup用于创建一个布尔掩码m2,该掩码对应于index与in对应column的值 匹配的条件。df2df1['Column2']

# STEP 4
# print(m2)
[True, False, True, True, False, True, False, False, True, False, True, True, True, False, True, True]

STEP 5:用于根据条件从中np.select选择元素,否则选择默认值。[1, 2][m1, m2]3

# STEP 5
# print(df2)
   index column  value
0    A_0    A_0      1
1    B_0    A_0      3
2    C_0    A_0      2
3    A_1    A_0      1
4    A_0    B_0      3
5    B_0    B_0      1
6    C_0    B_0      3
7    A_1    B_0      3
8    A_0    C_0      2
9    B_0    C_0      3
10   C_0    C_0      1
11   A_1    C_0      2
12   A_0    A_1      1
13   B_0    A_1      3
14   C_0    A_1      2
15   A_1    A_1      1

第 6 步:用于DataFrame.pivot根据indexcolumn值重塑数据框。

# STEP 6:
# print(df2)
     A_0  A_1  B_0  C_0
A_0    1    1    3    2
A_1    1    1    3    2
B_0    3    3    1    3
C_0    2    2    3    1

第 7 步:用于根据 的DataFrame.reindex索引重新索引(重新排列)索引和列。然后使用,删除在第 1 步中添加的索引和列中的计数器部分。df2df1Series.str.replace

# STEP 7: RESULT
# print(df2)
   A  B  C  A
A  1  3  2  1
B  3  1  3  3
C  2  3  1  2
A  1  3  2  1

推荐阅读