2016-04-01 2 views
1

Скажем у вас есть кадр данных, как тот, который следует (обратите внимание, что некоторые столбцы имеют такое же имя):Python рамки панды данных: как для выполнения операций на двух колоннах с тем же именем

import numpy as np 
import pandas as pd 

df = pd.DataFrame(np.random.rand(4,5), columns = list('abcab')) 

Этот вопрос если вы хотите выполнить некоторые операции над двумя столбцами «a», как вы это делаете, так как они имеют одно и то же имя? Я попытался использовать метод replace() и rename(), чтобы переименовать один из двух столбцов, а затем выполнить некоторые операции, но мне не удалось это сделать только на одном столбце.

+0

Извините, что вы спрашиваете здесь, как переименовать имена столбцов, чтобы они были уникальными? Если это так, вы можете переписать их как 'df.columns = list ('abcde')', вы не можете использовать 'rename' или' replace', поскольку имена столбцов не уникальны – EdChum

ответ

0

Вы можете использовать iloc, если вы не хотите переименовать столбцы:

import numpy as np 
import pandas as pd 

np.random.seed(0) 
df = pd.DataFrame(np.random.rand(4,5), columns = list('abcab')) 
print df 
      a   b   c   a   b 
0 0.548814 0.715189 0.602763 0.544883 0.423655 
1 0.645894 0.437587 0.891773 0.963663 0.383442 
2 0.791725 0.528895 0.568045 0.925597 0.071036 
3 0.087129 0.020218 0.832620 0.778157 0.870012 
#select first a column 
print df.iloc[:,0] 
0 0.548814 
1 0.645894 
2 0.791725 
3 0.087129 
Name: a, dtype: float64 

#select second a column 
print df.iloc[:,3] 
Name: a, dtype: float64 
0 0.544883 
1 0.963663 
2 0.925597 
3 0.778157 
Name: a, dtype: float64 

#select first a column 
print df['a'].iloc[:,0] 
0 0.548814 
1 0.645894 
2 0.791725 
3 0.087129 
Name: a, dtype: float64 

#select second a column 
print df['a'].iloc[:,1] 
0 0.544883 
1 0.963663 
2 0.925597 
3 0.778157 
Name: a, dtype: float64 

EDIT: Если вам нужно только переименовать столбцы с одинаковыми именами, используйте get_loc:

import numpy as np 
import pandas as pd 

np.random.seed(0) 
df = pd.DataFrame(np.random.rand(4,5), columns = list('abbab')) 
print df 
      a   b   b   a   b 
0 0.548814 0.715189 0.602763 0.544883 0.423655 
1 0.645894 0.437587 0.891773 0.963663 0.383442 
2 0.791725 0.528895 0.568045 0.925597 0.071036 
3 0.087129 0.020218 0.832620 0.778157 0.870012 

cols=pd.Series(df.columns) 
for dup in df.columns.get_duplicates(): 
    cols[df.columns.get_loc(dup)]=[dup+'_'+str(d_idx) if d_idx!=0 else dup for d_idx in range(df.columns.get_loc(dup).sum())] 
df.columns=cols 
print df 
      a   b  b_1  a_1  b_2 
0 0.548814 0.715189 0.602763 0.544883 0.423655 
1 0.645894 0.437587 0.891773 0.963663 0.383442 
2 0.791725 0.528895 0.568045 0.925597 0.071036 
3 0.087129 0.020218 0.832620 0.778157 0.870012 
0

Вы должны быть в состоянии изменить метку столбцов делает:

df.columns = ['a', 'b', 'c', 'd', 'e'] 
Смежные вопросы