[python] 여러 개의 새 열을 만들려면 팬더 기능을 열에 적용 하시겠습니까?

팬더에서 이것을하는 방법 :

extract_text_features단일 텍스트 열에 함수 가 있으며 여러 출력 열을 반환합니다. 특히이 함수는 6 개의 값을 반환합니다.

함수가 작동하지만 출력이 올바르게 할당 될 수있는 적절한 반환 유형 (팬더 DataFrame / numpy 배열 / Python 목록)이없는 것 같습니다 df.ix[: ,10:16] = df.textcol.map(extract_text_features)

그래서 이것에df.iterrows() 따라 반복으로 되돌려 야한다고 생각 합니까?

업데이트 : 반복 df.iterrows()은 20 배 이상 느리므로 항복하여 함수를 6 개의 개별 .map(lambda ...)호출 로 분할했습니다 .

업데이트 2 :이 질문은 v0.11.0 주위에서 다시 요청 되었습니다 . 따라서 많은 질문과 답변이 그다지 관련성이 없습니다.



답변

user1827356의 답변을 바탕으로 df.merge다음을 사용하여 한 번에 할당을 수행 할 수 있습니다 .

df.merge(df.textcol.apply(lambda s: pd.Series({'feature1':s+1, 'feature2':s-1})),
    left_index=True, right_index=True)

    textcol  feature1  feature2
0  0.772692  1.772692 -0.227308
1  0.857210  1.857210 -0.142790
2  0.065639  1.065639 -0.934361
3  0.819160  1.819160 -0.180840
4  0.088212  1.088212 -0.911788

편집 :
엄청난 메모리 소비와 저속에주의하십시오 : https://ys-l.github.io/posts/2015/08/28/how-not-to-use-pandas-apply/ !


답변

나는 보통 이것을 사용하여 zip:

>>> df = pd.DataFrame([[i] for i in range(10)], columns=['num'])
>>> df
    num
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9

>>> def powers(x):
>>>     return x, x**2, x**3, x**4, x**5, x**6

>>> df['p1'], df['p2'], df['p3'], df['p4'], df['p5'], df['p6'] = \
>>>     zip(*df['num'].map(powers))

>>> df
        num     p1      p2      p3      p4      p5      p6
0       0       0       0       0       0       0       0
1       1       1       1       1       1       1       1
2       2       2       4       8       16      32      64
3       3       3       9       27      81      243     729
4       4       4       16      64      256     1024    4096
5       5       5       25      125     625     3125    15625
6       6       6       36      216     1296    7776    46656
7       7       7       49      343     2401    16807   117649
8       8       8       64      512     4096    32768   262144
9       9       9       81      729     6561    59049   531441


답변

이것이 내가 과거에 한 일입니다

df = pd.DataFrame({'textcol' : np.random.rand(5)})

df
    textcol
0  0.626524
1  0.119967
2  0.803650
3  0.100880
4  0.017859

df.textcol.apply(lambda s: pd.Series({'feature1':s+1, 'feature2':s-1}))
   feature1  feature2
0  1.626524 -0.373476
1  1.119967 -0.880033
2  1.803650 -0.196350
3  1.100880 -0.899120
4  1.017859 -0.982141

완전성을위한 편집

pd.concat([df, df.textcol.apply(lambda s: pd.Series({'feature1':s+1, 'feature2':s-1}))], axis=1)
    textcol feature1  feature2
0  0.626524 1.626524 -0.373476
1  0.119967 1.119967 -0.880033
2  0.803650 1.803650 -0.196350
3  0.100880 1.100880 -0.899120
4  0.017859 1.017859 -0.982141


답변

이것이 95 %의 사용 사례에서이를 수행하는 정확하고 쉬운 방법입니다.

>>> df = pd.DataFrame(zip(*[range(10)]), columns=['num'])
>>> df
    num
0    0
1    1
2    2
3    3
4    4
5    5

>>> def example(x):
...     x['p1'] = x['num']**2
...     x['p2'] = x['num']**3
...     x['p3'] = x['num']**4
...     return x

>>> df = df.apply(example, axis=1)
>>> df
    num  p1  p2  p3
0    0   0   0    0
1    1   1   1    1
2    2   4   8   16
3    3   9  27   81
4    4  16  64  256


답변

2018 년, 나는 apply()논증과 함께 사용 한다result_type='expand'

>>> appiled_df = df.apply(lambda row: fn(row.text), axis='columns', result_type='expand')
>>> df = pd.concat([df, appiled_df], axis='columns')


답변

그냥 사용 result_type="expand"

df = pd.DataFrame(np.random.randint(0,10,(10,2)), columns=["random", "a"])
df[["sq_a","cube_a"]] = df.apply(lambda x: [x.a**2, x.a**3], axis=1, result_type="expand")


답변

요약 : 몇 개의 열만 만들려면 다음을 사용하십시오.df[['new_col1','new_col2']] = df[['data1','data2']].apply( function_of_your_choosing(x), axis=1)

이 솔루션의 경우, 작성중인 새 열 수는 .apply () 함수에 대한 입력으로 사용하는 열 수와 같아야합니다. 다른 것을하고 싶다면 다른 답변을 살펴보십시오.

세부 사항
2 열 데이터 프레임이 있다고 가정합니다. 첫 번째 열은 10 살인 사람의 키입니다. 두 번째는 20 세일 때의 키입니다.

각 사람의 키의 평균과 각 사람의 키의 합계를 모두 계산해야한다고 가정하십시오. 각 행당 두 개의 값입니다.

다음 곧 적용될 기능을 통해이 작업을 수행 할 수 있습니다.

def mean_and_sum(x):
    """
    Calculates the mean and sum of two heights.
    Parameters:
    :x -- the values in the row this function is applied to. Could also work on a list or a tuple.
    """

    sum=x[0]+x[1]
    mean=sum/2
    return [mean,sum]

이 기능을 다음과 같이 사용할 수 있습니다.

 df[['height_at_age_10','height_at_age_20']].apply(mean_and_sum(x),axis=1)

(명확하게하기 위해 :이 apply 함수는 서브 세트 데이터 프레임의 각 행에서 값을 받아서 목록을 리턴합니다.)

그러나 이렇게하면

df['Mean_&_Sum'] = df[['height_at_age_10','height_at_age_20']].apply(mean_and_sum(x),axis=1)

[mean, sum] 목록을 포함하는 1 개의 새 열을 만들 것입니다.이 열에는 다른 Lambda / Apply가 필요하기 때문에 피하고 싶을 것입니다.

대신, 각 값을 자체 열로 분리하려고합니다. 이를 위해 한 번에 두 개의 열을 만들 수 있습니다.

df[['Mean','Sum']] = df[['height_at_age_10','height_at_age_20']]
.apply(mean_and_sum(x),axis=1)