itsource

열 값을 기준으로 Panda에서 DataFrame 행 삭제

mycopycode 2022. 11. 15. 21:42
반응형

열 값을 기준으로 Panda에서 DataFrame 행 삭제

다음 Data Frame을 가지고 있습니다.

             daysago  line_race rating        rw    wrating
 line_date                                                 
 2007-03-31       62         11     56  1.000000  56.000000
 2007-03-10       83         11     67  1.000000  67.000000
 2007-02-10      111          9     66  1.000000  66.000000
 2007-01-13      139         10     83  0.880678  73.096278
 2006-12-23      160         10     88  0.793033  69.786942
 2006-11-09      204          9     52  0.636655  33.106077
 2006-10-22      222          8     66  0.581946  38.408408
 2006-09-29      245          9     70  0.518825  36.317752
 2006-09-16      258         11     68  0.486226  33.063381
 2006-08-30      275          8     72  0.446667  32.160051
 2006-02-11      475          5     65  0.164591  10.698423
 2006-01-13      504          0     70  0.142409   9.968634
 2006-01-02      515          0     64  0.134800   8.627219
 2005-12-06      542          0     70  0.117803   8.246238
 2005-11-29      549          0     70  0.113758   7.963072
 2005-11-22      556          0     -1  0.109852  -0.109852
 2005-11-01      577          0     -1  0.098919  -0.098919
 2005-10-20      589          0     -1  0.093168  -0.093168
 2005-09-27      612          0     -1  0.083063  -0.083063
 2005-09-07      632          0     -1  0.075171  -0.075171
 2005-06-12      719          0     69  0.048690   3.359623
 2005-05-29      733          0     -1  0.045404  -0.045404
 2005-05-02      760          0     -1  0.039679  -0.039679
 2005-04-02      790          0     -1  0.034160  -0.034160
 2005-03-13      810          0     -1  0.030915  -0.030915
 2004-11-09      934          0     -1  0.016647  -0.016647

다음 행은 삭제해야 합니다.line_race와 동등하다0가장 효율적인 방법은 무엇입니까?

올바르게 이해하고 있다면 다음과 같이 간단하게 이해할 수 있습니다.

df = df[df.line_race != 0]

하지만 앞으로 바이패스 수술을 하게 되면df = df[df.line_race != 0]필터링을 시도해도 아무것도 하지 않는다None/syslog 값.

동작:

df = df[df.line_race != 0]

아무것도 하지 않습니다.

df = df[df.line_race != None]

동작:

df = df[df.line_race.notnull()]

새로운 판다 평가관을 사용할 때 특히 유용한 다른 해결책을 추가한다면, 다른 해결책들은 원래의 판다를 대체하고 평가관을 잃게 될 것이다.

df.drop(df.loc[df['line_race']==0].index, inplace=True)

열의 여러 값을 기준으로 행을 삭제하려면 다음을 사용할 수 있습니다.

df[(df.line_race != 0) & (df.line_race != 10)]

값이 0 및 10인 모든 행을 삭제하는 방법:line_race.

앞의 답변과 거의 비슷하지만 인덱스 방식을 사용할 경우 다른 인덱스 방식 .loc()을 사용할 필요가 없습니다.그것은 다음과 비슷하지만 정확한 방법으로 할 수 있다.

df.drop(df.index[df['line_race'] == 0], inplace = True)

이를 위한 최선의 방법은 부울 마스킹을 사용하는 것입니다.

In [56]: df
Out[56]:
     line_date  daysago  line_race  rating    raw  wrating
0   2007-03-31       62         11      56  1.000   56.000
1   2007-03-10       83         11      67  1.000   67.000
2   2007-02-10      111          9      66  1.000   66.000
3   2007-01-13      139         10      83  0.881   73.096
4   2006-12-23      160         10      88  0.793   69.787
5   2006-11-09      204          9      52  0.637   33.106
6   2006-10-22      222          8      66  0.582   38.408
7   2006-09-29      245          9      70  0.519   36.318
8   2006-09-16      258         11      68  0.486   33.063
9   2006-08-30      275          8      72  0.447   32.160
10  2006-02-11      475          5      65  0.165   10.698
11  2006-01-13      504          0      70  0.142    9.969
12  2006-01-02      515          0      64  0.135    8.627
13  2005-12-06      542          0      70  0.118    8.246
14  2005-11-29      549          0      70  0.114    7.963
15  2005-11-22      556          0      -1  0.110   -0.110
16  2005-11-01      577          0      -1  0.099   -0.099
17  2005-10-20      589          0      -1  0.093   -0.093
18  2005-09-27      612          0      -1  0.083   -0.083
19  2005-09-07      632          0      -1  0.075   -0.075
20  2005-06-12      719          0      69  0.049    3.360
21  2005-05-29      733          0      -1  0.045   -0.045
22  2005-05-02      760          0      -1  0.040   -0.040
23  2005-04-02      790          0      -1  0.034   -0.034
24  2005-03-13      810          0      -1  0.031   -0.031
25  2004-11-09      934          0      -1  0.017   -0.017

In [57]: df[df.line_race != 0]
Out[57]:
     line_date  daysago  line_race  rating    raw  wrating
0   2007-03-31       62         11      56  1.000   56.000
1   2007-03-10       83         11      67  1.000   67.000
2   2007-02-10      111          9      66  1.000   66.000
3   2007-01-13      139         10      83  0.881   73.096
4   2006-12-23      160         10      88  0.793   69.787
5   2006-11-09      204          9      52  0.637   33.106
6   2006-10-22      222          8      66  0.582   38.408
7   2006-09-29      245          9      70  0.519   36.318
8   2006-09-16      258         11      68  0.486   33.063
9   2006-08-30      275          8      72  0.447   32.160
10  2006-02-11      475          5      65  0.165   10.698

업데이트: 이제 판다 0.13이 출시되었으므로, 이것을 하는 또 다른 방법은df.query('line_race != 0').

값이 여러 개이고 str dtype인 경우

다음 항목을 사용하여 col에서 지정된 값을 필터링했습니다.

def filter_rows_by_values(df, col, values):
    return df[~df[col].isin(values)]

예:

DataFrame에서 "str" 열에 값 "b" 및 "c"가 있는 행을 제거합니다.

df = pd.DataFrame({"str": ["a","a","a","a","b","b","c"], "other": [1,2,3,4,5,6,7]})
df
   str  other
0   a   1
1   a   2
2   a   3
3   a   4
4   b   5
5   b   6
6   c   7

filter_rows_by_values(df, "str", ["b","c"])

   str  other
0   a   1
1   a   2
2   a   3
3   a   4

위의 누군가가 당신이 사용할 수 있다고 했음에도 불구하고 주어진 답변은 정확하다.df.query('line_race != 0')당신의 문제에 따라 훨씬 더 빠릅니다.강력추천합니다.

또 다른 방법이지코드가 다른 답변에 기재되어 있는 코드보다 조금 복잡해 보이기 때문에 가장 효율적인 방법은 아닐 수 있지만, 여전히 동일한 작업을 수행하는 다른 방법입니다.

  df = df.drop(df[df['line_race']==0].index)

효율적이고 팬더적인 방법 중 하나는eq()방법:

df[~df.line_race.eq(0)]

코드를 컴파일하여 실행했습니다.이것은 정확한 코드입니다.직접 시도해 보세요.

data = pd.read_excel('file.xlsx')

열 이름에 특수 문자 또는 공백이 있는 경우 여기에 입력할 수 있습니다.''지정된 코드와 같습니다.

data = data[data['expire/t'].notnull()]
print (date)

공백이나 특수 문자 없이 단일 문자열 열 이름만 있는 경우 직접 액세스할 수 있습니다.

data = data[data.expire ! = 0]
print (date)

한 가지 방법을 더 추가한다.

 df = df.query("line_race!=0")

DataFrame을 모든 열로 확장하는 다른 방법을 추가하기만 하면 됩니다.

for column in df.columns:
   df = df[df[column]!=0]

예:

def z_score(data,count):
   threshold=3
   for column in data.columns:
       mean = np.mean(data[column])
       std = np.std(data[column])
       for i in data[column]:
           zscore = (i-mean)/std
           if(np.abs(zscore)>threshold):
               count=count+1
               data = data[data[column]!=i]
   return data,count

행을 삭제해야 하지만 값이 다른 열에 있을 수 있습니다.제 경우 백분율을 사용했기 때문에 모든 열에 값이 1인 행을 삭제하려고 했습니다. 이는 100%를 의미하기 때문입니다.

for x in df:
    df.drop(df.loc[df[x]==1].index, inplace=True)

df에 열이 너무 많으면 최적이 아닙니다.

로는 별 논리는 '어느 정도'를 사용하는 .drop()행 삭제 시 역논리를 사용하는 것보다 더 간단하기 때문입니다.를 들어, 행이 있다, 행이 없다, 라고 경우는 해 주세요.A=1 AND (B=2 OR C=3).

이해하기 쉽고 복잡한 로직을 처리할 수 있는 확장 가능한 구문은 다음과 같습니다.

df.drop( df.query(" `line_race` == 0 ").index)

다음을 사용해 볼 수 있습니다.

df.drop(df[df.line_race != 0].index, inplace = True)

.

언급URL : https://stackoverflow.com/questions/18172851/deleting-dataframe-row-in-pandas-based-on-column-value

반응형