판다를 사용하여 둘 이상의 최대 열 찾기
열이 있는 데이터 프레임이 있습니다.A
,B
열을 만들어야 합니다.C
모든 레코드/행에 대해 다음과 같이 설정합니다.
C = max(A, B)
.
어떻게 하면 좋을까요?
다음과 같은 최대값을 얻을 수 있습니다.
>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [-2, 8, 1]})
>>> df
A B
0 1 -2
1 2 8
2 3 1
>>> df[["A", "B"]]
A B
0 1 -2
1 2 8
2 3 1
>>> df[["A", "B"]].max(axis=1)
0 1
1 8
2 3
그래서:
>>> df["C"] = df[["A", "B"]].max(axis=1)
>>> df
A B C
0 1 -2 1
1 2 8 8
2 3 1 3
만약 당신이 "A"와 "B"가 유일한 열이라는 것을 안다면, 당신은 심지어 도망칠 수 있습니다.
>>> df["C"] = df.max(axis=1)
그리고 당신은 사용할 수 있습니다..apply(max, axis=1)
제 생각에, 제가봐요.
@DSM의 대답은 거의 모든 일반 시나리오에서 완벽하게 좋습니다.그러나 만약 당신이 표면 레벨보다 조금 더 깊이 들어가고 싶어하는 타입의 프로그래머라면, 당신은 기본적으로 numpy 함수를 호출하는 것이 조금 더 빠르다는 것을 알고 싶을 것입니다..values
<0.24) 어레이의 경우 DataFrame/Series 개체에 정의된 (사이톤화된) 함수를 직접 호출하는 대신 사용할 수 있습니다.
예를 들어 첫 번째 축을 따라 사용할 수 있습니다.
# Data borrowed from @DSM's post.
df = pd.DataFrame({"A": [1,2,3], "B": [-2, 8, 1]})
df
A B
0 1 -2
1 2 8
2 3 1
df['C'] = df[['A', 'B']].values.max(1)
# Or, assuming "A" and "B" are the only columns,
# df['C'] = df.values.max(1)
df
A B C
0 1 -2 1
1 2 8 8
2 3 1 3
데이터가 다음과 같은 경우NaN
s, 다음이 필요합니다.
df['C'] = np.nanmax(df.values, axis=1)
df
A B C
0 1 -2 1
1 2 8 8
2 3 1 3
사용할 수도 있습니다.numpy.maximum.reduce
는numpy.maximum
ufunc(범용 함수)이며, 모든 ufunc에는 다음이 있습니다.
df['C'] = np.maximum.reduce(df['A', 'B']].values, axis=1)
# df['C'] = np.maximum.reduce(df[['A', 'B']], axis=1)
# df['C'] = np.maximum.reduce(df, axis=1)
df
A B C
0 1 -2 1
1 2 8 8
2 3 1 3
np.maximum.reduce
그리고.np.max
(대부분의 일반적인 크기의 데이터 프레임에 대해) 거의 동일한 것으로 보이며 보다 약간 빠른 속도를 보입니다.DataFrame.max
이 차이는 대략 일정하게 유지되며 내부 오버헤드(인덱스 정렬, NaN 처리 등) 때문이라고 생각합니다.
그래프는 성능 그림을 사용하여 생성되었습니다.참조용 벤치마킹 코드:
import pandas as pd
import perfplot
np.random.seed(0)
df_ = pd.DataFrame(np.random.randn(5, 1000))
perfplot.show(
setup=lambda n: pd.concat([df_] * n, ignore_index=True),
kernels=[
lambda df: df.assign(new=df.max(axis=1)),
lambda df: df.assign(new=df.values.max(1)),
lambda df: df.assign(new=np.nanmax(df.values, axis=1)),
lambda df: df.assign(new=np.maximum.reduce(df.values, axis=1)),
],
labels=['df.max', 'np.max', 'np.maximum.reduce', 'np.nanmax'],
n_range=[2**k for k in range(0, 15)],
xlabel='N (* len(df))',
logx=True,
logy=True)
여러 열에서 최대값을 찾는 경우:
df[['A','B']].max(axis=1).max(axis=0)
예:
df =
A B
timestamp
2019-11-20 07:00:16 14.037880 15.217879
2019-11-20 07:01:03 14.515359 15.878632
2019-11-20 07:01:33 15.056502 16.309152
2019-11-20 07:02:03 15.533981 16.740607
2019-11-20 07:02:34 17.221073 17.195145
print(df[['A','B']].max(axis=1).max(axis=0))
17.221073
언급URL : https://stackoverflow.com/questions/12169170/find-the-max-of-two-or-more-columns-with-pandas
'programing' 카테고리의 다른 글
장고 쿼리 세트를 딕트 목록으로 변환하려면 어떻게 해야 합니까? (0) | 2023.07.06 |
---|---|
Angular 응용 프로그램에서 Puppeteer를 사용하는 방법 (0) | 2023.07.06 |
exec(@sql)에서 값 반환 (0) | 2023.07.06 |
두 개의 다른 막대 열의 연결을 나타내는 열 추가 (0) | 2023.07.06 |
VBA에서 사용되지 않는 변수를 알 수 있는 방법이 있습니까? (0) | 2023.07.06 |