将索引值与列名进行比较;PythonPandas

2024-04-26 05:50:03 发布

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

嗨,我有两个数据帧,如下所示

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

预期结果:

result

我们可以不使用for循环来实现它吗

注:df1的形状和值每次都可能不同


Tags: 数据fromdataframecolumn语句dictpddf1
1条回答
网友
1楼 · 发布于 2024-04-26 05:50:03

使用:

# 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:由于原始数据帧包含重复的值,我们可以使用df.groupbyColumn上使用cumcount并将其与df['Column']连接,以在df1中创建唯一的索引。然后我们可以从数据帧df1初始化新的数据帧df2

# 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:使用^{}取消数据帧的绑定

# 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:使用^{}创建一个布尔掩码m1,它对应于df2中的index等于df2中的column的条件

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

步骤4:使用^{}创建一个布尔掩码m2,该掩码对应于df1['Column2']indexcolumndf2对应值匹配的条件

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

步骤5:使用^{}根据[m1, m2]中的条件从[1, 2]中选择元素,否则选择默认值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:使用^{}根据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步:使用^{}根据df1的索引重新编制df2的索引和列的索引(重新排列)。然后使用^{},删除在步骤1中添加的索引和列中的计数器部分

# 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

相关问题 更多 >