У меня есть такой DataFrame:

     A            B      C
"010-1"       "Car"     500
"010-2"     "Train"     302
"Result"      "010"      23
"011-1"      "Ship"     321
"011-2"     "Plane"     321
"011-3"      "Bike"     321
"Result"      "011"     321

Теперь можно сместить Pandas столбцы A и B в строках, где значение "Result" находится в столбце A?

Итак, этот конечный результат:

     A            B       C
"010-1"       "Car"     500
"010-2"     "Train"     302
  "010"     "Result"     23
"011-1"      "Ship"     321
"011-2"     "Plane"     321
"011-3"      "Bike"     321
  "011"    "Result"     321

РЕДАКТИРОВАТЬ: на самом деле может быть больше столбцов, кроме A и B

3
Alex T 22 Май 2020 в 13:23

3 ответа

Лучший ответ

Вы можете использовать функцию numpy where():

Исходный фрейм данных:

In[6]: df
Out[6]: 
        A      B    C
0   010-1    Car  500
1   010-2  Train  302
2  Result    010   23
3   011-1   Ship  321
4   011-2  Plane  321
5   011-3   Bike  321
6  Result    011  321

< Сильный > Команды
(используя общий шаблон Python x, y = y, x для переключения значений)

In[7]: cond = df.A == "Result"
In[8]: df.A, df.B = np.where(cond, df.B, df.A), np.where(cond, df.A, df.B)

Результат:

In[9]: df
Out[9]: 
       A       B    C
0  010-1     Car  500
1  010-2   Train  302
2    010  Result   23
3  011-1    Ship  321
4  011-2   Plane  321
5  011-3    Bike  321
6    011  Result  321
2
MarianD 22 Май 2020 в 11:21

Длинная рука использовать np.where

m=df['A'].str.contains('"Result"')
df['b']=df['B']
df['B']=np.where(m,df['A'], df['B'])
df['C']=np.where(m,df['b'], df['C'])
df.drop(columns=['b'], inplace=True)
df

enter image description here

1
wwnde 22 Май 2020 в 10:39

Пытаться:

df['A'],df['B'] =df['A'].combine(df['B'],lambda x,y : [x,y] if x != 'Result' else [y,x]).str
1
Akhilesh_IN 22 Май 2020 в 11:25