我有一个像这样的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/