Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按条件更改和交换行和列中的值_Python_Pandas_Dataframe_Conditional Statements - Fatal编程技术网

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)