열 값을 기준으로 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
'itsource' 카테고리의 다른 글
mariadb sql default unix_mari (0) | 2022.11.15 |
---|---|
리디렉션 후 PHP 세션 손실 (0) | 2022.11.15 |
데이터베이스 설계에서 "n:m"과 "1:n"의 의미 (0) | 2022.11.15 |
Number 객체가 속성을 보유하여 숫자를 증가시키면 이 코드에서 어떤 일이 발생합니까? (0) | 2022.11.15 |
사용자 이름 없이 Mariadb 연결이 중단되었습니다. (0) | 2022.11.15 |