Python 按条件更改和交换行和列中的值
我有以下数据帧: 我想检查Python 按条件更改和交换行和列中的值,python,pandas,dataframe,conditional-statements,Python,Pandas,Dataframe,Conditional Statements,我有以下数据帧: 我想检查'A start'列中的值是否为负值。如果是这样,则在'start'列和'end'列以及'A start'列和'A end'列中,在'A start'具有负值的行中交换值。因此,结果应该是: 我试着用where解决它,但它不起作用 df[['A start','A end']] = df[['A end','A start']].where(df['A start'] < 0 , df[['A start','A end']].values) 不幸的是没有帮
'A start'
列中的值是否为负值。如果是这样,则在'start'
列和'end'
列以及'A start'
列和'A end'
列中,在'A start'
具有负值的行中交换值。因此,结果应该是:
我试着用where
解决它,但它不起作用
df[['A start','A end']] = df[['A end','A start']].where(df['A start'] < 0 , df[['A start','A end']].values)
不幸的是没有帮助。虽然循环在数据帧中不是很有效,但我认为您可以做以下几点: 将原始值保存到变量中,并使用“df.at”更新值
对于索引,df.iterrows()中的行:
如果行['A start']<0:
orig_start=行['start']
orig_end=行['end']
orig_A_start=行['A start']
orig_A_end=行['A end']
df.at[索引'start']=起始
df.at[索引'end']=起始
df.at[index,'A start']=orig_A_end
df.at[索引'A end']=起始
假设两个变量中的一个始终为负值,则只需按max/min排序即可
df[['A start','A end']] = df[['A start','A end']].agg([max,min],axis=1)
这样做:
import numpy as np
df3 = pd.read_csv(r"c:/users/k_sego/perce.csv",sep=";")
给
Start end A Start A end
0 1 4 234 -654
1 5 6 -475 312
2 7 8 -765 987
3 2 9 113 -553
以及重组
df3['A Start'],df3['A end']=np.where(df3['A Start']< 0,(df3['A end'],df3['A Start']),(df3['A Start'],df3['A end']))
如果起始值小于零,此代码将在起始列和结束列之间交换值:
for i, row in df.iterrows():
if row['A start'] < 0:
start_value = row['start']
end_value = row['end']
df.iloc[i, df.columns.get_loc('start')] = end_value
df.iloc[i, df.columns.get_loc('end')] = start_value
df.iterrows()中的i行的:
如果行['A start']<0:
起始值=行['start']
end_值=行['end']
df.iloc[i,df.columns.get_loc('start')]=end_值
df.iloc[i,df.columns.get\u loc('end')]=start\u值
i
是索引,行
是带列值的字典。df[['start','end']=df['end','start']]。其中(df['A start']<0,df['start','end'].值)
df[['start','end']] = df[['end','start']].where(df['A start'] < 0 , df[['start','end']].values)
df[['A start','A end']] = df[['A end','A start']].where(df['A start'] < 0 , df[['A start','A end']].values)
df[['A start','A end']]=df[['A end','A start']]。其中(df['A start']<0,df['A start','A end']]。值)
请不要发布截图好吗?发布数据以及您迄今为止为解决问题所做的工作。谢谢我添加了代码,我使用了。谢谢你的评论。这正是我以前测试过的方法,但不起作用。当开始为负数时,“开始”列和“结束”列中的值也应该交换。这对我来说确实有效,因为你可以从我发布的输出中看到这一点。你检查过数据帧中的数据类型了吗?我也在做同样的事情(读取csv)。这可能是一个问题,因为这里使用的是np,我使用的是熊猫数据帧?谢谢,这是唯一有效的方法。但是如何交换开始列和结束列中的值呢?谢谢你的回复,不幸的是它不起作用。你能告诉我它有什么问题吗?没有交换值或给出错误?df[['start','end']]=df[['end','start']]。其中(df['A start']<0,df[['start','end'].values)df['A start','A end']=df['A end','A start']]。其中(df['A start']<0,df['A start','A end'].values)df['A start'.]。在我的代码中导入For循环太难了。对于同一个问题,总是有更多的解决方案-For循环是标准python库的一部分,也是您学习的任何面向对象语言的一部分。有一个很大的区别-一些不工作或有一个更优雅的方式来解决它。我很高兴你找到了一个解决方案。谢谢你的回复,不幸的是它不起作用。当你使用这个代码时,你能给我提供输出吗?另外,你能给我提供正在测试它的数据帧吗?
Start end A Start A end
0 1 4 234 -654
1 5 6 312 -475
2 7 8 987 -765
3 2 9 113 -553
for i, row in df.iterrows():
if row['A start'] < 0:
start_value = row['start']
end_value = row['end']
df.iloc[i, df.columns.get_loc('start')] = end_value
df.iloc[i, df.columns.get_loc('end')] = start_value
df[['start','end']] = df[['end','start']].where(df['A start'] < 0 , df[['start','end']].values)
df[['A start','A end']] = df[['A end','A start']].where(df['A start'] < 0 , df[['A start','A end']].values)