pandas 检查行的列值是否等于同一 Dataframe 的其他行的当前列或其他列中的值

dgiusagp  于 2023-02-11  发布在  其他
关注(0)|答案(1)|浏览(120)

我有以下的dataframe

| a| b_1       | b_2       |b_3  |c_1        | c_2       | c_3 |
|--|-----------|-----------|-----|-----------|-----------|-----|
|e1|3295.000000|-775.000000|604.5|3575.000000|-626.000000|604.5|
|e2|3615.000000|-731.000000|604.5|1          |0          |0    |
|e3|3615.000000|-731.000000|604.5|3575.000000|-626.000000|604.5| 
|e2|3615.000000|-731.000000|604.5|1          |0          | 0   | 
|e1|3295.000000|-775.000000|604.5|3575.000000|-626.000000|604.5|
|e4| 0         |0          | 0   |0          |0          | 0   |

我希望生成的dataframe如下所示

|a | b                              |c                              | d |  
|--|--------------------------------|-------------------------------|------|
|e1| [3295.000000,-775.000000,604.5]|[3575.000000,-626.000000,604.5]|e3| 
|e2| [3615.000000,-731.000000,604.5]|[1, 0, 0]                      |e3| 
|e3| [3615.000000,-731.000000,604.5]|[3575.000000,-626.000000,604.5]|e1, e2|
|e4| [0, 0, 0]                      |[0, 0, 0]                      |None  |

请注意,bc包含大小为3的numpy数组。
用于填充列d的参数如下:
1.如果活动行的b中的值等于b中除其自身之外的任何其他记录,则取这些记录的a值。
1.如果活动行的b中的值等于c中除其自身之外的任何其他记录,则取这些记录的a值。
1.如果活动行的c中的值等于c中除其自身之外的任何其他记录,则取这些记录的a值。
1.无其他

t9aqgxwy

t9aqgxwy1#

a列使用DataFrame.drop_duplicates

df1 = df.drop_duplicates().copy()
print (df1)

    a           b           c
0  e1   [1, 2, 3]  [1, 2, -3]
1  e2  [-1, 2, 3]   [1, 0, 0]
2  e3  [-1, 2, 3]  [1, 2, -3]
5  e4   [0, 0, 0]   [0, 0, 0]

然后将值转换为numpy数组,因为每列始终有相同的3个值b,c

a = np.array(df1['b'].tolist())
b = np.array(df1['c'].tolist())

与广播比较,通过将False设置为对角掩码排除相同行:

m = (a == a[:, None]).all(axis=2) |  (b == b[:, None]).all(axis=2)
np.fill_diagonal(m, False)
print (m)
[[False False  True False]
 [False False  True False]
 [ True  True False False]
 [False False False False]]

然后使用numpy.dot作为df1['a']的连接值,删除最后一个,并替换空字符串:

df1['d'] = np.dot(m, df1['a'] + ',')
df1['d'] = df1['d'].str[:-1].replace('', np.nan, regex=True)
print (df1)
    a           b           c      d
0  e1   [1, 2, 3]  [1, 2, -3]     e3
1  e2  [-1, 2, 3]   [1, 0, 0]     e3
2  e3  [-1, 2, 3]  [1, 2, -3]  e1,e2
5  e4   [0, 0, 0]   [0, 0, 0]    NaN

相关问题