数据框 - 某些样式的行差异

问题描述 投票:0回答:2

我想要列“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
python pandas dataframe difference
2个回答
1
投票

首先将

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

1
投票

选择行并

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
© www.soinside.com 2019 - 2024. All rights reserved.