2

I've run a string operation on the column of a dataframe to generate new column names in another array. So far so good.

columns = dfnum.columns.values
print(columns)
qcolumns = [x + 'q' for x in columns]
print(qcolumns)

When I try to run a for loop over these two arrays to generate the quantile cuts of the original values in the database I get this though:

for column in columns, qcolumn in qcolumns:
dfnumqcut = pd.qcut(dfnum[[column]],5)
dfnum[qcolumn] = dfnumqcut.codes

I get a bunch of errors per below. What I am trying to go is to get the qcuts and join them to the dataframe. I can do this column by column as per the below but there should be some way to do this using a for loop:

dfnumqcut = pd.qcut(dfnum[['Market Cap']],5)
dfnum['Market Capq'] = dfnumqcut.codes

1 for column in columns, qcolumn in qcolumns:
----> 2 dfnumqcut = pd.qcut(dfnum[[column]],5)
3 dfnum[qcolumn] = dfnumqcut.codes

TypeError: unhashable type: 'numpy.ndarray'

jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252

1 Answers1

1

I think you can use enumerate with select values of qcolumns by position:

for i, column in enumerate(columns):
    dfnumqcut = pd.qcut(dfnum[[column]],5)
    dfnum[qcolumns[i]] = dfnumqcut.codes
print (dfnum)

Solution without creating qcolumns - new column names are created in one loop:

for i, column in enumerate(columns):
    dfnumqcut = pd.qcut(dfnum[[column]],5)
    dfnum[column + 'q'] = dfnumqcut.codes
print (dfnum)

Simplier solution - if loop DataFrame if loop columns values:

for i, column in enumerate(dfnum):
    dfnum[column + 'q'] = pd.qcut(dfnum[[column]],5).codes
print (dfnum)

Sample:

dfnum = pd.DataFrame({'A':[1,2,3],
                    'B':[4,5,6],
                    'C':[7,8,9],
                    'D':[1,3,5],
                    'E':[5,3,6],
                    'F':[7,4,3]})

print (dfnum)
  A  B  C  D  E  F
0  1  4  7  1  5  7
1  2  5  8  3  3  4
2  3  6  9  5  6  3

for i, column in enumerate(dfnum):
    dfnum[column + 'q'] = pd.qcut(dfnum[[column]],5).codes
print (dfnum)
   A  B  C  D  E  F  Aq  Bq  Cq  Dq  Eq  Fq
0  1  4  7  1  5  7   0   0   0   0   2   4
1  2  5  8  3  3  4   2   2   2   2   0   2
2  3  6  9  5  6  3   4   4   4   4   4   0
Community
  • 1
  • 1
jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252