[python] 팬더 / 파이썬에서 데이터 프레임에 두 개의 텍스트 열 결합

팬더를 사용하여 Python에서 20 x 4000 데이터 프레임이 있습니다. 이 열 중 두 개는 이름이 Yearquarter입니다. periodmake Year = 2000quarter= q2into 라는 변수를 만들고 싶습니다 2000q2.

누구든지 그걸 도울 수 있습니까?



답변

두 열이 모두 문자열 인 경우 직접 연결할 수 있습니다.

df["period"] = df["Year"] + df["quarter"]

열 중 하나 (또는 ​​둘 다)가 문자열 유형이 아닌 경우 먼저 열을 변환해야합니다.

df["period"] = df["Year"].astype(str) + df["quarter"]

이 작업을 수행 할 때 NaN을주의하십시오!


여러 문자열 열을 조인 해야하는 경우 다음을 사용할 수 있습니다 agg.

df['period'] = df[['Year', 'quarter', ...]].agg('-'.join, axis=1)

여기서 “-“는 구분 기호입니다.


답변

df = pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']})
df['period'] = df[['Year', 'quarter']].apply(lambda x: ''.join(x), axis=1)

이 데이터 프레임을 생성합니다

   Year quarter  period
0  2014      q1  2014q1
1  2015      q2  2015q2

이 방법 df[['Year', 'quarter']]은 데이터 프레임의 열 슬라이스 로 대체하여 임의의 수의 문자열 열을 일반화합니다 ( 예 🙂 df.iloc[:,0:2].apply(lambda x: ''.join(x), axis=1).

apply () 메소드에 대한 자세한 정보는 여기에서 확인할 수 있습니다.


답변

작은 데이터 세트 (<150 행)

[''.join(i) for i in zip(df["Year"].map(str),df["quarter"])]

또는 약간 느리지 만 컴팩트합니다.

df.Year.str.cat(df.quarter)

더 큰 데이터 세트 (> 150 행)

df['Year'].astype(str) + df['quarter']

업데이트 : 타이밍 그래프 팬더 0.23.4

여기에 이미지 설명을 입력하십시오

200K 행 DF에서 테스트 해 봅시다.

In [250]: df
Out[250]:
   Year quarter
0  2014      q1
1  2015      q2

In [251]: df = pd.concat([df] * 10**5)

In [252]: df.shape
Out[252]: (200000, 2)

최신 정보: Pandas 0.19.0을 사용한 새로운 타이밍

CPU / GPU 최적화가없는 타이밍 (가장 빠른 속도에서 느린 속도로 정렬) :

In [107]: %timeit df['Year'].astype(str) + df['quarter']
10 loops, best of 3: 131 ms per loop

In [106]: %timeit df['Year'].map(str) + df['quarter']
10 loops, best of 3: 161 ms per loop

In [108]: %timeit df.Year.str.cat(df.quarter)
10 loops, best of 3: 189 ms per loop

In [109]: %timeit df.loc[:, ['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 567 ms per loop

In [110]: %timeit df[['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 584 ms per loop

In [111]: %timeit df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)
1 loop, best of 3: 24.7 s per loop

CPU / GPU 최적화를 사용한 타이밍 :

In [113]: %timeit df['Year'].astype(str) + df['quarter']
10 loops, best of 3: 53.3 ms per loop

In [114]: %timeit df['Year'].map(str) + df['quarter']
10 loops, best of 3: 65.5 ms per loop

In [115]: %timeit df.Year.str.cat(df.quarter)
10 loops, best of 3: 79.9 ms per loop

In [116]: %timeit df.loc[:, ['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 230 ms per loop

In [117]: %timeit df[['Year','quarter']].astype(str).sum(axis=1)
1 loop, best of 3: 230 ms per loop

In [118]: %timeit df[['Year','quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)
1 loop, best of 3: 9.38 s per loop

답변으로 @ anton-vbr


답변

이 방법 cat().str접근은 이 정말 잘 작동합니다 :

>>> import pandas as pd
>>> df = pd.DataFrame([["2014", "q1"],
...                    ["2015", "q3"]],
...                   columns=('Year', 'Quarter'))
>>> print(df)
   Year Quarter
0  2014      q1
1  2015      q3
>>> df['Period'] = df.Year.str.cat(df.Quarter)
>>> print(df)
   Year Quarter  Period
0  2014      q1  2014q1
1  2015      q3  2015q3

cat() 예를 들어 연도와 기간에 정수만 있다고 가정하면 다음과 같이 구분 기호를 추가 할 수 있습니다.

>>> import pandas as pd
>>> df = pd.DataFrame([[2014, 1],
...                    [2015, 3]],
...                   columns=('Year', 'Quarter'))
>>> print(df)
   Year Quarter
0  2014       1
1  2015       3
>>> df['Period'] = df.Year.astype(str).str.cat(df.Quarter.astype(str), sep='q')
>>> print(df)
   Year Quarter  Period
0  2014       1  2014q1
1  2015       3  2015q3

여러 열을 조인하는 것은 str.cat()첫 번째 열 (시리즈) 에서 호출 할 매개 변수로 첫 번째 열을 제외한 모든 열을 포함하는 데이터 목록 또는 계열 목록을 전달하는 것입니다 .

>>> df = pd.DataFrame(
...     [['USA', 'Nevada', 'Las Vegas'],
...      ['Brazil', 'Pernambuco', 'Recife']],
...     columns=['Country', 'State', 'City'],
... )
>>> df['AllTogether'] = df['Country'].str.cat(df[['State', 'City']], sep=' - ')
>>> print(df)
  Country       State       City                   AllTogether
0     USA      Nevada  Las Vegas      USA - Nevada - Las Vegas
1  Brazil  Pernambuco     Recife  Brazil - Pernambuco - Recife

팬더 데이터 프레임 / 시리즈에 null 값이있는 경우 NaN 값을 문자열로 바꾸려면 na_rep 매개 변수를 포함해야합니다. 그렇지 않으면 결합 된 열의 기본값은 NaN입니다.


답변

이번에는 string.format ()과 함께 lamba 함수를 사용합니다.

import pandas as pd
df = pd.DataFrame({'Year': ['2014', '2015'], 'Quarter': ['q1', 'q2']})
print df
df['YearQuarter'] = df[['Year','Quarter']].apply(lambda x : '{}{}'.format(x[0],x[1]), axis=1)
print df

  Quarter  Year
0      q1  2014
1      q2  2015
  Quarter  Year YearQuarter
0      q1  2014      2014q1
1      q2  2015      2015q2

이를 통해 문자열이 아닌 문자열로 작업하고 필요에 따라 값을 다시 포맷 할 수 있습니다.

import pandas as pd
df = pd.DataFrame({'Year': ['2014', '2015'], 'Quarter': [1, 2]})
print df.dtypes
print df

df['YearQuarter'] = df[['Year','Quarter']].apply(lambda x : '{}q{}'.format(x[0],x[1]), axis=1)
print df

Quarter     int64
Year       object
dtype: object
   Quarter  Year
0        1  2014
1        2  2015
   Quarter  Year YearQuarter
0        1  2014      2014q1
1        2  2015      2015q2


답변

귀하의 질문에 대한 간단한 답변.

    year    quarter
0   2000    q1
1   2000    q2

> df['year_quarter'] = df['year'] + '' + df['quarter']

> print(df['year_quarter'])
  2000q1
  2000q2


답변

@silvado 답변이 좋으면 변경 df.map(str)하면 df.astype(str)더 빠릅니다.

import pandas as pd
df = pd.DataFrame({'Year': ['2014', '2015'], 'quarter': ['q1', 'q2']})

In [131]: %timeit df["Year"].map(str)
10000 loops, best of 3: 132 us per loop

In [132]: %timeit df["Year"].astype(str)
10000 loops, best of 3: 82.2 us per loop