programing

판다를 사용하여 둘 이상의 최대 열 찾기

bestprogram 2023. 7. 6. 22:26

판다를 사용하여 둘 이상의 최대 열 찾기

열이 있는 데이터 프레임이 있습니다.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 

데이터가 다음과 같은 경우NaNs, 다음이 필요합니다.

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.reducenumpy.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

enter image description here

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