python pandas는 중복 열을 제거합니다.
데이터 프레임에서 중복 열을 제거하는 가장 쉬운 방법은 무엇입니까?
다음을 통해 중복 열이있는 텍스트 파일을 읽고 있습니다.
import pandas as pd
df=pd.read_table(fname)
열 이름은 다음과 같습니다.
Time, Time Relative, N2, Time, Time Relative, H2, etc...
모든 시간 및 시간 상대 열에는 동일한 데이터가 포함됩니다. 내가 원하는:
Time, Time Relative, N2, H2
삭제, 삭제 등의 모든 시도 :
df=df.T.drop_duplicates().T
고유 값 인덱스 오류가 발생합니다.
Reindexing only valid with uniquely valued index objects
팬더 멍청이가되어서 죄송합니다. 모든 제안을 주시면 감사하겠습니다.
추가 세부 사항
Pandas 버전 : 0.9.0
Python 버전 : 2.7.3
Windows 7
(Pythonxy 2.7.3.0을 통해 설치됨)
데이터 파일 (참고 : 실제 파일에서 열은 탭으로 구분되며 여기서는 4 개의 공백으로 구분됩니다) :
Time Time Relative [s] N2[%] Time Time Relative [s] H2[ppm]
2/12/2013 9:20:55 AM 6.177 9.99268e+001 2/12/2013 9:20:55 AM 6.177 3.216293e-005
2/12/2013 9:21:06 AM 17.689 9.99296e+001 2/12/2013 9:21:06 AM 17.689 3.841667e-005
2/12/2013 9:21:18 AM 29.186 9.992954e+001 2/12/2013 9:21:18 AM 29.186 3.880365e-005
... etc ...
2/12/2013 2:12:44 PM 17515.269 9.991756+001 2/12/2013 2:12:44 PM 17515.269 2.800279e-005
2/12/2013 2:12:55 PM 17526.769 9.991754e+001 2/12/2013 2:12:55 PM 17526.769 2.880386e-005
2/12/2013 2:13:07 PM 17538.273 9.991797e+001 2/12/2013 2:13:07 PM 17538.273 3.131447e-005
문제에 대한 한 줄 해결책이 있습니다. 이것은 일부 열 이름이 중복되어 제거하려는 경우에 적용됩니다.
df = df.loc[:,~df.columns.duplicated()]
작동 원리 :
데이터 프레임의 열이 다음과 같다고 가정합니다. ['alpha','beta','alpha']
df.columns.duplicated()
부울 배열을 반환합니다 : a True
또는 False
각 열에 대해. 그렇다면 False
열 이름은 해당 지점까지 고유하고, 그렇다면 True
열 이름은 이전에 중복됩니다. 예를 들어 주어진 예제를 사용하면 반환되는 값은입니다 [False,False,True]
.
Pandas
부울 값을 사용하여 인덱싱 할 수 있으므로 True
값만 선택 합니다. 우리는 중복되지 열을 유지하려는 때문에, 우리는 이성을 상실하는 부울 배열 이상 (예를 필요 [True, True, False] = ~[False,False,True]
)
마지막으로 df.loc[:,[True,True,False]]
앞서 언급 한 인덱싱 기능을 사용하여 중복되지 않은 열만 선택합니다.
참고 : 위는 열 값이 아닌 열 이름 만 확인 합니다.
고유 한 열 이름을 이미 알고있는 것 같습니다. 그렇다면 df = df['Time', 'Time Relative', 'N2']
작동합니다.
그렇지 않은 경우 솔루션이 작동합니다.
In [101]: vals = np.random.randint(0,20, (4,3))
vals
Out[101]:
array([[ 3, 13, 0],
[ 1, 15, 14],
[14, 19, 14],
[19, 5, 1]])
In [106]: df = pd.DataFrame(np.hstack([vals, vals]), columns=['Time', 'H1', 'N2', 'Time Relative', 'N2', 'Time'] )
df
Out[106]:
Time H1 N2 Time Relative N2 Time
0 3 13 0 3 13 0
1 1 15 14 1 15 14
2 14 19 14 14 19 14
3 19 5 1 19 5 1
In [107]: df.T.drop_duplicates().T
Out[107]:
Time H1 N2
0 3 13 0
1 1 15 14
2 14 19 14
3 19 5 1
데이터를 엉망으로 만드는 특정 데이터가있을 수 있습니다. 데이터에 대해 더 자세한 정보를 제공해 주시면 더 많은 도움을 드릴 수 있습니다.
편집 : Andy가 말했듯이 문제는 중복 된 열 제목에있을 수 있습니다.
샘플 테이블 파일 'dummy.csv'의 경우 다음과 같이 구성했습니다.
Time H1 N2 Time N2 Time Relative
3 13 13 3 13 0
1 15 15 1 15 14
14 19 19 14 19 14
19 5 5 19 5 1
사용 read_table
하면 고유 한 열이 제공되고 제대로 작동합니다.
In [151]: df2 = pd.read_table('dummy.csv')
df2
Out[151]:
Time H1 N2 Time.1 N2.1 Time Relative
0 3 13 13 3 13 0
1 1 15 15 1 15 14
2 14 19 19 14 19 14
3 19 5 5 19 5 1
In [152]: df2.T.drop_duplicates().T
Out[152]:
Time H1 Time Relative
0 3 13 0
1 1 15 14
2 14 19 14
3 19 5 1
귀하의 버전이 허용하지 않는 경우 솔루션을 함께 해킹하여 고유하게 만들 수 있습니다.
In [169]: df2 = pd.read_table('dummy.csv', header=None)
df2
Out[169]:
0 1 2 3 4 5
0 Time H1 N2 Time N2 Time Relative
1 3 13 13 3 13 0
2 1 15 15 1 15 14
3 14 19 19 14 19 14
4 19 5 5 19 5 1
In [171]: from collections import defaultdict
col_counts = defaultdict(int)
col_ix = df2.first_valid_index()
In [172]: cols = []
for col in df2.ix[col_ix]:
cnt = col_counts[col]
col_counts[col] += 1
suf = '_' + str(cnt) if cnt else ''
cols.append(col + suf)
cols
Out[172]:
['Time', 'H1', 'N2', 'Time_1', 'N2_1', 'Time Relative']
In [174]: df2.columns = cols
df2 = df2.drop([col_ix])
In [177]: df2
Out[177]:
Time H1 N2 Time_1 N2_1 Time Relative
1 3 13 13 3 13 0
2 1 15 15 1 15 14
3 14 19 19 14 19 14
4 19 5 5 19 5 1
In [178]: df2.T.drop_duplicates().T
Out[178]:
Time H1 Time Relative
1 3 13 0
2 1 15 14
3 14 19 14
4 19 5 1
큰 DataFrame의 경우 전치가 비효율적입니다. 다음은 대안입니다.
def duplicate_columns(frame):
groups = frame.columns.to_series().groupby(frame.dtypes).groups
dups = []
for t, v in groups.items():
dcols = frame[v].to_dict(orient="list")
vs = dcols.values()
ks = dcols.keys()
lvs = len(vs)
for i in range(lvs):
for j in range(i+1,lvs):
if vs[i] == vs[j]:
dups.append(ks[i])
break
return dups
다음과 같이 사용하십시오.
dups = duplicate_columns(frame)
frame = frame.drop(dups, axis=1)
편집하다
nan을 다른 값처럼 처리하는 메모리 효율적인 버전 :
from pandas.core.common import array_equivalent
def duplicate_columns(frame):
groups = frame.columns.to_series().groupby(frame.dtypes).groups
dups = []
for t, v in groups.items():
cs = frame[v].columns
vs = frame[v]
lcs = len(cs)
for i in range(lcs):
ia = vs.iloc[:,i].values
for j in range(i+1, lcs):
ja = vs.iloc[:,j].values
if array_equivalent(ia, ja):
dups.append(cs[i])
break
return dups
If I'm not mistaken, the following does what was asked without the memory problems of the transpose solution and with fewer lines than @kalu 's function, keeping the first of any similarly named columns.
Cols = list(df.columns)
for i,item in enumerate(df.columns):
if item in df.columns[:i]: Cols[i] = "toDROP"
df.columns = Cols
df = df.drop("toDROP",1)
First step:- Read first row i.e all columns the remove all duplicate columns.
Second step:- Finally read only that columns.
cols = pd.read_csv("file.csv", header=None, nrows=1).iloc[0].drop_duplicates()
df = pd.read_csv("file.csv", usecols=cols)
참고URL : https://stackoverflow.com/questions/14984119/python-pandas-remove-duplicate-columns
'Programing' 카테고리의 다른 글
MVC Razor 뷰 중첩 foreach의 모델 (0) | 2020.08.27 |
---|---|
트위터 부트 스트랩 버튼 스타일링 (0) | 2020.08.27 |
MySQL 연결이 작동하지 않음 : 2002 해당 파일 또는 디렉토리가 없습니다. (0) | 2020.08.27 |
UICollectionView의 셀을 중앙 정렬하는 방법은 무엇입니까? (0) | 2020.08.27 |
누락 된 파일을 포함하도록 과거 커밋을 변경하는 방법은 무엇입니까? (0) | 2020.08.27 |