2016-07-29 2 views
3

모든 열에 대해 일치해야합니다주어진 열 내의 모든 행은 주어진 열 내의 모든 행이 일치해야하는 나는 데이터의 팬더 DataFrame이

df = pd.DataFrame({'A': [1,1,1,1,1,1,1,1,1,1], 
        'B': [2,2,2,2,2,2,2,2,2,2], 
        'C': [3,3,3,3,3,3,3,3,3,3], 
        'D': [4,4,4,4,4,4,4,4,4,4], 
        'E': [5,5,5,5,5,5,5,5,5,5]}) 

In [10]: df 
Out[10]: 
    A B C D E 
0 1 2 3 4 5 
1 1 2 3 4 5 
2 1 2 3 4 5 
... 
6 1 2 3 4 5 
7 1 2 3 4 5 
8 1 2 3 4 5 
9 1 2 3 4 5 

내가 알고있는 빠른 방법을 싶습니다있다 DataFrame 어디에서나 차이가 있습니다. 이 시점에서 나는 나중에 값을 처리 할 것이므로 어떤 값이 다양했는지 알 필요가 없습니다. DataFrame이 더 많은 관심을 필요로하는지, 아니면 무시하고 다음 단계로 넘어갈 수 있는지 알기 위해서는 빠른 방법이 필요합니다.

나는

(df.loc[:,'A'] != df.loc[0,'A']).any() 

를 사용하여 특정 열을 확인할 수 있습니다하지만 내 팬더 ​​지식은 (내가 반복 팬더에 눈살을 찌푸리게되는 이해) 모두 비교하기 위해 열을 반복하는 나를 제한 :

A B C D E 
0 1 2 3 4 5 
1 1 2 9 4 5 
2 1 2 3 4 5 
... 
6 1 2 3 4 5 
7 1 2 3 4 5 
8 1 2 3 4 5 
9 1 2 3 4 5 

for col in df.columns: 
    if (df.loc[:,col] != df.loc[0,col]).any(): 
     print("Found a fail in col %s" % col) 
     break 

Out: Found a fail in col C 

데이터 프레임의 모든 열에있는 행이 열의 모든 값과 일치하지 않는 경우 부울을 반환하는 우아한 방법이 있습니까? 반복하지 않고도 가능합니까?

답변

4

귀하의 예를 감안할 때 dataframe가 :

df = pd.DataFrame({'A': [1,1,1,1,1,1,1,1,1,1], 
        'B': [2,2,2,2,2,2,2,2,2,2], 
        'C': [3,3,3,3,3,3,3,3,3,3], 
        'D': [4,4,4,4,4,4,4,4,4,4], 
        'E': [5,5,5,5,5,5,5,5,5,5]}) 

당신은 다음을 사용할 수 있습니다 : 당신을 제공

df.apply(pd.Series.nunique) > 1 

:

우리가 다음 오류의 몇 가지를 강제하는 경우 17,451,515,
A False 
B False 
C False 
D False 
E False 
dtype: bool 

:

df.loc[3, 'C'] = 0 
df.loc[5, 'B'] = 20 

당신은 얻을 :

A False 
B  True 
C  True 
D False 
E False 
dtype: bool 
+0

지금까지의 모든 접근법은 잘 작동하지만, nunique()를 사용하면 코드 판독기 (나)에게 무슨 일이 일어나고 있는지 알 수 있습니다. –

2

당신은 컬럼을 통해 루프 apply를 사용하여 컬럼의 모든 요소가 같은 경우 확인할 수 있습니다

df.apply(lambda col: (col != col[0]).any()) 

# A False 
# B False 
# C False 
# D False 
# E False 
# dtype: bool 
+0

apply()를 지적 해 주셔서 감사합니다. 저걸 도구 가방에 넣어야 할 것 같네요. –

4

당신은 다음과 같이 첫 번째 행에 전체 DataFrame을 비교할 수 있습니다

In [11]: df.eq(df.iloc[0], axis='columns') 
Out[11]: 
     A  B  C  D  E 
0 True True True True True 
1 True True True True True 
2 True True True True True 
3 True True True True True 
4 True True True True True 
5 True True True True True 
6 True True True True True 
7 True True True True True 
8 True True True True True 
9 True True True True True 

그런 다음 모든 값이 true인지 테스트합니다.

In [13]: df.eq(df.iloc[0], axis='columns').all() 
Out[13]: 
A True 
B True 
C True 
D True 
E True 
dtype: bool 

In [14]: df.eq(df.iloc[0], axis='columns').all().all() 
Out[14]: True 
+0

좋습니다. 나는 그 방향의 문제를 보려고 생각하지 않았습니다. 당신은 팬더와 훌륭한 기술을 가지고 있습니다. 팬더를 얼마나 오랫동안 사용해 왔는지 물어봐도 될까요? –

관련 문제