根据条件移动pandas数据帧的行



我想将在before_id列中具有值的每一行移动到该行的下面,该行的值与其node_id列的值相同。我一直在努力,我已经尝试过重新索引,但这对我来说不是一个好的解决方案。那么,有可能改变每一行的位置吗??还是我应该在没有熊猫的情况下完成??你能给我小费吗??非常感谢。

client_data = """node_id,option,before_id
1,A,
5,A,4
4,C,1
6,A,
2,A,1
7,C,6
"""
df = pd.read_csv(io.StringIO(client_data), error_bad_lines=False)

before = pd.notnull(df['before_id'])
for ind,row in df.iterrows():
if pd.notnull(row[2]):
before_id = row[2] # identifying before_id column 
before_ind = df.loc[df['node_id'] == before_id].index 
next_ind = before_ind[0] + 1 # the goal index 
row.reindex(index=next_ind)
else:
pass
df.to_csv('./result3.csv', index=False)
ideal output 
node_id,option,before_id
1,A,
2,A,1
8,C,2
6,A,
7,C,6

如果我理解正确:

df = pd.DataFrame({'node_id': {0: 1, 1: 5, 2: 4, 3: 6, 4: 2, 5: 7}, 
'option': {0: 'A', 1: 'A', 2: 'C', 3: 'A', 4: 'A', 5: 'C'}, 
'before_id': {0: np.nan, 1: 4.0, 2: 1.0, 3: np.nan, 4: 1.0, 5: 6.0}})
# sort so 'option' is ordered alphabetically when 'before_id' is same (?)
df.sort_values('option', inplace=True)
# count occurrences of each 'before_id' & add to create counter
df['x'] = .01
df['y'] = df.groupby('before_id')['x'].transform(np.cumsum) + df['before_id']
# create sorting column
df['z'] = df['y'].fillna(df['node_id'])
df.sort_values(['z'], inplace=True)

返回

node_id option  before_id     x     y     z
0        1      A        NaN  0.01   NaN  1.00
4        2      A        1.0  0.01  1.01  1.01
2        4      C        1.0  0.01  1.02  1.02
1        5      A        4.0  0.01  4.01  4.01
3        6      A        NaN  0.01   NaN  6.00
5        7      C        6.0  0.01  6.01  6.01

然后可以删除xyz

相关内容

  • 没有找到相关文章

最新更新