我想要列“position”与“Seg”列与“x”相邻的差异。
import numpy as np
import pandas as pd
mydict = {'position':['0.0', '0.433', '2.013', '3.593', '5.173', '6.753', '6.9'],'Seg':['x', 'x', np.nan, np.nan, np.nan, np.nan, 'x']}
df = pd.DataFrame.from_dict(mydict)
df
position Seg
0 0.0 x
1 0.433 x
2 2.013 NaN
3 3.593 NaN
4 5.173 NaN
5 6.753 NaN
6 6.9 x
如何获得“diff”和“Seg ID”之间的差异?注意:“x”可以随机出现在任何行,“Seg ID”也会相应变化。
position Seg diff Seg ID
0 0.0 x NaN NaN
1 0.433 x 0.433 Seg 1
2 2.013 NaN NaN NaN
3 3.593 NaN NaN NaN
4 5.173 NaN NaN NaN
5 6.753 NaN NaN NaN
6 6.9 x 6.467 Seg 2
首先将
position
中的字符串转换为按 Series.astype
浮动:
df['position'] = df['position'].astype(float)
Series.diff
获取差异 - 通过x
进行比较:
m = df['Seg'].eq('x')
df.loc[m, 'diff'] = df.loc[m, 'position'].diff()
如果差异不是
NaN
by Series.cumsum
,则创建计数器:
m1 = df['diff'].notna()
df.loc[m1, 'Seg ID'] = 'Seg ' + m1[m1].cumsum().astype(str)
print (df)
position Seg diff Seg ID
0 0.000 x NaN NaN
1 0.433 x 0.433 Seg 1
2 2.013 NaN NaN NaN
3 3.593 NaN NaN NaN
4 5.173 NaN NaN NaN
5 6.753 NaN NaN NaN
6 6.900 x 6.467 Seg 2
不同的输入数据:
mydict = {'position':['0.0', '0.433', '2.013', '3.593', '5.173', '6.753', '6.9'],
'Seg':['x', 'x', np.nan, np.nan, np.nan, 'x', 'x']}
df = pd.DataFrame.from_dict(mydict)
print (df)
position Seg
0 0.0 x
1 0.433 x
2 2.013 NaN
3 3.593 NaN
4 5.173 NaN
5 6.753 x
6 6.9 x
df['position'] = df['position'].astype(float)
m = df['Seg'].eq('x')
df.loc[m, 'diff'] = df.loc[m, 'position'].diff()
m1 = df['diff'].notna()
df.loc[m1, 'Seg ID'] = 'Seg ' + m1[m1].cumsum().astype(str)
print (df)
position Seg diff Seg ID
0 0.000 x NaN NaN
1 0.433 x 0.433 Seg 1
2 2.013 NaN NaN NaN
3 3.593 NaN NaN NaN
4 5.173 NaN NaN NaN
5 6.753 x 6.320 Seg 2
6 6.900 x 0.147 Seg 3
diff
:
df['position'] = df['position'].astype(float)
df['diff'] = df.loc[df['Seg'].eq('x'), 'position'].diff()
如果您还想要索引:
m = df['Seg'].eq('x')
df.loc[m, 'Seg ID'] = 'Seg ' + m[df['diff'].notna()].cumsum().astype(str)
输出:
position Seg diff Seg ID
0 0.000 x NaN NaN
1 0.433 x 0.433 Seg 1
2 2.013 NaN NaN NaN
3 3.593 NaN NaN NaN
4 5.173 NaN NaN NaN
5 6.753 NaN NaN NaN
6 6.900 x 6.467 Seg 2