Python Pandas는 데이터 프레임의 행을 복제합니다.
데이터 프레임이 다음과 같은 경우:
Store,Dept,Date,Weekly_Sales,IsHoliday
1,1,2010-02-05,24924.5,FALSE
1,1,2010-02-12,46039.49,TRUE
1,1,2010-02-19,41595.55,FALSE
1,1,2010-02-26,19403.54,FALSE
1,1,2010-03-05,21827.9,FALSE
1,1,2010-03-12,21043.39,FALSE
1,1,2010-03-19,22136.64,FALSE
1,1,2010-03-26,26229.21,FALSE
1,1,2010-04-02,57258.43,FALSE
그리고 나는 행들을 복제하고 싶습니다.IsHolidayTRUE와 동일하게 다음 작업을 수행할 수 있습니다.
is_hol = df['IsHoliday'] == True
df_try = df[is_hol]
df=df.append(df_try*10)
하지만 휴일 행을 5번 복사해야 하고 위 방법을 사용하면 5번 추가해야 하는데 더 좋은 방법이 없을까요?
넣을 수 있습니다.df_try목록 안에 있는 다음에 당신이 생각하는 것을(를)
>>> df.append([df_try]*5,ignore_index=True)
Store Dept Date Weekly_Sales IsHoliday
0 1 1 2010-02-05 24924.50 False
1 1 1 2010-02-12 46039.49 True
2 1 1 2010-02-19 41595.55 False
3 1 1 2010-02-26 19403.54 False
4 1 1 2010-03-05 21827.90 False
5 1 1 2010-03-12 21043.39 False
6 1 1 2010-03-19 22136.64 False
7 1 1 2010-03-26 26229.21 False
8 1 1 2010-04-02 57258.43 False
9 1 1 2010-02-12 46039.49 True
10 1 1 2010-02-12 46039.49 True
11 1 1 2010-02-12 46039.49 True
12 1 1 2010-02-12 46039.49 True
13 1 1 2010-02-12 46039.49 True
다른 방법은 concat() 함수를 사용하는 것입니다.
import pandas as pd
In [603]: df = pd.DataFrame({'col1':list("abc"),'col2':range(3)},index = range(3))
In [604]: df
Out[604]:
col1 col2
0 a 0
1 b 1
2 c 2
In [605]: pd.concat([df]*3, ignore_index=True) # Ignores the index
Out[605]:
col1 col2
0 a 0
1 b 1
2 c 2
3 a 0
4 b 1
5 c 2
6 a 0
7 b 1
8 c 2
In [606]: pd.concat([df]*3)
Out[606]:
col1 col2
0 a 0
1 b 1
2 c 2
0 a 0
1 b 1
2 c 2
0 a 0
1 b 1
2 c 2
이것은 오래된 질문이지만, 구글에서 여전히 제 결과의 맨 위에 올라오기 때문에, 다른 방법이 있습니다.
import pandas as pd
import numpy as np
df = pd.DataFrame({'col1':list("abc"),'col2':range(3)},index = range(3))
col1="b"인 행을 복제한다고 가정합니다.
reps = [3 if val=="b" else 1 for val in df.col1]
df.loc[np.repeat(df.index.values, reps)]
당신이 대체할 수 있습니다.3 if val=="b" else 1val=="b"이면 3을 반환하거나 val=="c"이면 4를 반환할 수 있는 다른 함수와 함께 목록 해석에서 상당히 유연합니다.
Panda에서는 보통 추가 및 연결이 느리기 때문에 행 목록을 새로 작성하여 데이터 프레임으로 변환하는 것이 좋습니다(단일 행을 추가하거나 데이터 프레임을 연결하지 않는 한).
import pandas as pd
df = pd.DataFrame([
[1,1,'2010-02-05',24924.5,False],
[1,1,'2010-02-12',46039.49,True],
[1,1,'2010-02-19',41595.55,False],
[1,1,'2010-02-26',19403.54,False],
[1,1,'2010-03-05',21827.9,False],
[1,1,'2010-03-12',21043.39,False],
[1,1,'2010-03-19',22136.64,False],
[1,1,'2010-03-26',26229.21,False],
[1,1,'2010-04-02',57258.43,False]
], columns=['Store','Dept','Date','Weekly_Sales','IsHoliday'])
temp_df = []
for row in df.itertuples(index=False):
if row.IsHoliday:
temp_df.extend([list(row)]*5)
else:
temp_df.append(list(row))
df = pd.DataFrame(temp_df, columns=df.columns)
한 줄로 할 수 있습니다.
df.append([df[df['IsHoliday'] == True]] * 5, ignore_index=True)
아니면
df.append([df[df['IsHoliday']]] * 5, ignore_index=True)
에 대한 또 다른 대안.append()먼저 열의 값을 항목 목록으로 바꾼 다음explode()(사용하거나)ignore_index=True원하는 것에 따라 또는 그렇지 않음):
df['IsHoliday'] = df['IsHoliday'].apply(lambda x: 5*[x] if (x == True) else x)
df.explode('IsHoliday', ignore_index=True)
이것의 좋은 점은 당신이 이미 목록을 사용할 수 있다는 것입니다.apply()열에 값이 수정된 행의 복사본을 만들기 위해 호출합니다. 나중에 그렇게 하고 싶을 때를 대비해서...
언급URL : https://stackoverflow.com/questions/24029659/python-pandas-replicate-rows-in-dataframe
'programing' 카테고리의 다른 글
| 전체 컨텍스트에서 git diff를 얻으려면 어떻게 해야 합니까? (0) | 2023.10.22 |
|---|---|
| 'ID' 특성 대신 'Class'를 사용하도록 WordPress Jetpack 플러그인 수정 (0) | 2023.10.22 |
| Apache Commons Logging의 런타임 검색 알고리즘의 문제점은 무엇입니까? (0) | 2023.10.22 |
| 캐시를 지운 후 npm이 작동하지 않음 (0) | 2023.10.22 |
| Android Studio에서 벡터 자산의 채우기 색 변경 (0) | 2023.10.22 |