팬더를 사용하여 Python에서 20 x 4000 데이터 프레임이 있습니다. 이 열 중 두 개는 이름이 Year
및 quarter
입니다. period
make Year = 2000
및 quarter= q2
into 라는 변수를 만들고 싶습니다 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