Pandas df.drop, когда значение столбца равно определенному значению, не работает должным образом - PullRequest
0 голосов
/ 02 ноября 2019

Я запускаю следующий код для удаления строк с определенным значением в столбце. Тем не менее, кажется, что сбрасывается больше строк, чем содержит ключ. Полный код и пример приведены ниже

 import pandas as pd
 import numpy as np
 df=pd.DataFrame([['1','2','3'],['e','f','g'], ['a','b','c']], columns = ['start', 'middle', 'finish'])
 print('start',df,sep='\n',end='\n\n')

 def testAddColAndDelRow():
   #experiment in this line: df=df.copy(), df=df.iloc[:2,:2], df.iloc[:2,:2].copy(), nothing, ...
    df['newCol']=11
    df.drop(df[df['start'] == '1'].index, inplace=True)
    data_add = ['t', 's', 'q', 'p']
    df.loc[len(df)] = data_add
    return df 

 testAddColAndDelRow()
 print('df',df,sep='\n',end='\n\n')

Я ожидаю следующего результата.

e          f      g     11
a          b      c     11
t          s      q      p

Но я понял - Там, где также убран ряд со знаком. Кто-нибудь знает, что это может быть так?

 e      f      g     11
 t      s      q      p

Ответы [ 3 ]

0 голосов
/ 02 ноября 2019

Я использовал ваш код и получил ожидаемые вами результаты. Использование: Python 3.7.4 pandas == 0.25.2 numpy == 1.16.4 дал мне:

    start
      start middle finish
    0     1      2      3
    1     e      f      g
    2     a      b      c

    df
      start middle finish newCol
    0     1      2      3     11
    1     e      f      g     11
    2     a      b      c     11
    3     t      s      q      p

Надеюсь, это поможет.

0 голосов
/ 03 ноября 2019

Во-первых, имейте в виду, что многократное добавление и удаление из DataFrame почти никогда не требуется. Скорее всего, есть лучший способ сделать что-то.

Теперь, если предположить, что это чисто ради обучения, вот как я бы переписал ваш код:

import pandas as pd


df = pd.DataFrame(data=[['1', '2', '3'], ['e', 'f', 'g'], ['a', 'b', 'c']], columns=['start', 'middle', 'finish'])

print(f'before test:\n{df}\n')


def test_rem_and_add(df_in_raw):
    df_in = df_in_raw.copy(deep=True)
    df_in.drop(df_in[df_in['start'] == '1'].index, inplace=True)
    df_in.reset_index(drop=True, inplace=True)
    df_in['new_col'] = '11'
    new_row = {'start': 't', 'middle': 's', 'finish': 'q', 'new_col': 'p'}
    df_in = df_in.append(other=new_row, ignore_index=True)
    return df_in


df = test_rem_and_add(df)

print(f'after test:\n{df}\n')
0 голосов
/ 02 ноября 2019

Вы переписываете строку 2:

def testAddColAndDelRow():
    #experiment in this line: df=df.copy(), df=df.iloc[:2,:2], df.iloc[:2,:2].copy(), nothing, ...
    df['newCol']=11
    df.drop(df[df['start'] == '1'].index, inplace=True)
    print(df)
    print('-'*20)
    print('length of df: ',len(df))
    print('-'*20)
    data_add = ['t', 's', 'q', 'p']
    df.loc[len(df)] = data_add
    return df 

testAddColAndDelRow()
print('df',df,sep='\n',end='\n\n')



  start middle finish  newCol
1     e      f      g      11
2     a      b      c      11
--------------------
length of df:  2
--------------------
df
  start middle finish newCol
1     e      f      g     11
2     t      s      q      p

Ваше решение может быть использовано DataFrame.reset_index:

def testAddColAndDelRow():
    #experiment in this line: df=df.copy(), df=df.iloc[:2,:2], df.iloc[:2,:2].copy(), nothing, ...
    df['newCol']=11
    df.drop(df[df['start'] == '1'].index, inplace=True)
    df.reset_index(drop=True,inplace=True)
    data_add = ['t', 's', 'q', 'p']
    df.loc[len(df)] = data_add
    return df 

testAddColAndDelRow()
print('df',df,sep='\n',end='\n\n')




start
  start middle finish
0     1      2      3
1     e      f      g
2     a      b      c

df
  start middle finish newCol
0     e      f      g     11
1     a      b      c     11
2     t      s      q      p

Я рекомендуюдобавление последней строки перед отсутствием проблем с индексом и использование Boolean indexing для удаления строк, где start == 1 или '1'

df['new_col']=11
df.loc[len(df)]=['t','s','q','p']
df=df.loc[df.start.ne('1')]
print(df)
  start middle finish new_col
1     e      f      g      11
2     a      b      c      11
3     t      s      q       p
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...