Как эту итерацию можно применить к кадру данных, чтобы изменить его? - PullRequest
0 голосов
/ 13 февраля 2019

Цель состоит в том, чтобы переименовать столбцы фрейма данных на основе условия и изменить значения соответствующих столбцов.

Объединить несколько фреймов данных

df1 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'eTIV': [1.12, 2.22, 3.43, 5.43], })
df2 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Ear_Vol': [5, 6, 7, 8]})
df3 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Nose': [1, 2, 3, 5], })
df4 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Eye_Vol': [1, 2, 3, 5], })
df5 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Finger': [1.3, 2.123, 3.4, 5.5], })

dfs = [df1, df2, df3, df4,df5]

df_final = reduce(lambda left,right: pd.merge(left,right,on='ID'), dfs)

df_final

    ID      eTIV    Ear_Vol Nose    Eye_Vol Finger
0   Mary    1.12    5       1       1       1.300
1   Mike    2.22    6       2       2       2.123
2   Barry   3.43    7       3       3       3.400
3   Scotty  5.43    8       5       5       5.500

Изменить имена столбцов

    df_final.columns = df_final.columns.str.replace(r"_Vol", "_Vol_Adj")

df_final_Adj = pd.DataFrame (data = df_final, columns = df_final.columns) df_final_Adj

ID      eTIV    Ear_Vol_Adj Nose    Eye_Vol_Adj Finger

0 Мэри 1.12 5 1 1 1.300 1 Майк 2.22 6 2 2 2.123 2 Барри 3.43 73 3 3.400 3 Scotty 5.43 8 5 5 5.500

Изменить значения столбцов, содержащих заголовок '_Adj'.

cols = df_final_Adj.columns[df_final_Adj.columns.str.contains('_Adj')].tolist()
print(cols)

['Ear_Vol_Adj', 'Eye_Vol_Adj']

Подход 1:

df_final_Adj[col] = df_final_Adj[col].div(df_final_Adj['eTIV'], axis=0)

Ошибка:

TypeError: unsupported operand type(s) for /: 'str' and 'int'"

Подход 2:

for col in cols:
        df_final_Adj[col] = df_final_Adj[col].div(df_final_Adj['eTIV'], axis=0)

Ошибка:

TypeError: unsupported operand type(s) for /: 'str' and 'int'

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Этот подход работает:

for col in cols:
    df_final_Adj[col] = df_final_Adj[col].div(df_final_Adj['eTIV'], axis=0)
df_final_Adj
0 голосов
/ 13 февраля 2019

Предполагая, что изображение, показанное в OP, содержит данные до применения функции eTIV_Adjust, вот моя попытка

Генерация данных в соответствии с описанием OP

d = [['one', 'two_Volume', 'three', 'four', 'five', 'six', 'four_Volume'],
    [1,1,5,1,5,5,5],
    [1,1,5,1,5,5,5],
    [1,1,5,1,5,5,5],
    [1,1,5,1,5,5,5],
    [1,1,5,1,5,5,5]]

df = pd.DataFrame(d[1:], columns=d[0])
print(df)
   one  two_Volume  three  four  five  six  four_Volume
0    1           1      5     1     5    5            5
1    1           1      5     1     5    5            5
2    1           1      5     1     5    5            5
3    1           1      5     1     5    5            5
4    1           1      5     1     5    5            5

Теперь эта строка if 'Vol' in key: предполагает, что вы ищете столбцы, содержащие частичную строку 'Vol'.Вы можете использовать .str.contains для поиска этих столбцов без iterrorws или .apply (как предложил выше Энди Хейден), используя этот подход

cols = df.columns[df.columns.str.contains('Vol')].tolist()
print(cols)
['two_Volume', 'four_Volume']

Теперь просто разделите этистолбцы в столбце с именем five (см. этот полезный пост SO )

df[cols] = df[cols].div(df['five'], axis=0)
print(df)
   one  two_Volume  three  four  five  six  four_Volume
0    1         0.2      5     1     5    5          1.0
1    1         0.2      5     1     5    5          1.0
2    1         0.2      5     1     5    5          1.0
3    1         0.2      5     1     5    5          1.0
4    1         0.2      5     1     5    5          1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...