我有一个像这样的DataFrame:

         A   B
0  name1_X   2
1  name2_X   2
2  name3_X   2
3  name1_Y NaN
4  name2_Y NaN
5  name3_Y NaN


其中A列是带后缀name_X_Y,而B列是一个值。

我想用_Y等于

`-1 * corresponding `_X`


同名。

输出应该是

         A   B
0  name1_X   2
1  name2_X   2
2  name3_X   2
3  name1_Y  -2
4  name2_Y  -2
5  name3_Y  -2


有时,DataFrame

         A   B
0  name1_X   2
1  name1_Y NaN
2  name2_Y NaN
3  name3_Y NaN


输出应为:

         A   B
0  name1_X   2
1  name1_Y  -2
2  name2_Y NaN
3  name3_Y NaN


非重叠部分仍为NaN

如何以简单的方式解决此问题?

最佳答案

从数据框中分离出“ X”值,并创建相应的“ Y”值。然后串联。

我已经扩展了示例数据框,以考虑名称不匹配的情况。在这种情况下,如果名称以“ _X”结尾,则将创建一个新的“ _Y”名称变量。如果存在名称“ _Y”,但没有对应的名称“ _X”,则将其保持不变。

df = pd.DataFrame({'A': ['name0_X', 'name2_X', 'name3_X', 'name1_Y', 'name2_Y', 'name4_Y'],
                   'B': [2.0, 2.0, 2.0, None, None, None]})
>>> df
         A   B
0  name0_X   2  # Create new `name0_Y`
1  name2_X   2  # Match. Multiply value by minus one.
2  name3_X   2  # Create new `name3_Y`
3  name1_Y NaN  # No match. Leave as is.
4  name2_Y NaN  # Update with matching X after multiplying by minus one.
5  name4_Y NaN  # No match. Leave as is.

dfx = df[df.A.str[-2:] == '_X']
dfy = dfx.copy()
dfy.B *= -1
dfy.A = dfy.A.str[:-2] + '_Y'
y_names = df[df.A.str[-2:] == '_Y'].A
missing_Y_names = y_names[~y_names.isin(dfy.A)]
df_missing_y = df.loc[df.A.isin(missing_Y_names), :]
result = pd.concat([dfx, dfy, df_missing_y], ignore_index=True)

>>> result
         A   B
0  name0_X   2
1  name2_X   2
2  name3_X   2
3  name0_Y  -2
4  name2_Y  -2
5  name3_Y  -2
6  name1_Y NaN
7  name4_Y NaN

关于python - 设置一些行等于其他行 Pandas ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34501607/

10-12 18:31