2016-12-14 1 views
2

У меня есть такие данные;Pandas: Как получить значения max и min и написать для каждой строки?

>> df 
    A B C 
0 1 5 1 
1 1 7 1 
2 1 6 1 
3 1 7 1 
4 2 5 1 
5 2 8 1 
6 2 6 1 
7 3 7 1 
8 3 9 1 
9 4 6 1 
10 4 7 1 
11 4 1 1 

Я хочу принять максимальные и минимальные значения столбца B в зависимости от столбца A (для каждого же значения столбца А, я хочу, чтобы найти минимальную и максимальный в столбце B) и хочу написать результаты по исходной таблице. Мой код:

df1 = df.groupby(['A']).B.transform(max) 
df1 = df1.rename(columns={'B':'B_max'}) 
df2 = df.groupby.(['A']).B.transform(min) 
df1 = df1.rename(columns={'B':'B_min'}) 
df3 = df.join(df1['B_max']).join(df2['B_min']) 

Это результат.

A B C B_max B_min 
0 1 5 1   
1 1 7 1 7 
2 1 6 1 
3 1 4 1   4 
4 2 5 1 
5 2 8 1 8 
6 2 6 1   6 
7 3 7 1   7 
8 3 9 1 9 
9 4 6 1 
10 4 7 1 7 
11 4 1 1   1 

Но я хочу, чтобы таблица выглядела так:

A B C B_max B_min 
0 1 5 1 7  4 
1 1 7 1 7  4 
2 1 6 1 7  4 
3 1 4 1 7  4 
4 2 5 1 8  6 
5 2 8 1 8  6 
6 2 6 1 8  6 
7 3 7 1 9  7 
8 3 9 1 9  7 
9 4 6 1 7  1 
10 4 7 1 7  1 
11 4 1 1 7  1 

интерпретировать код результат, чтобы выглядеть следующим образом

ответ

2

Я думаю, вам нужно всего лишь присвоить значения новых столбцов, потому что transform возвращение Series с такой же длины, как df:

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

print (df) 
    A B C 
0 1 5 1 
1 1 7 1 
2 1 6 1 
3 1 7 1 
4 2 5 1 
5 2 8 1 
6 2 6 1 
7 3 7 1 
8 3 9 1 
9 4 6 1 
10 4 7 1 
11 4 1 1 
df['B_max'] = df.groupby(['A']).B.transform(max) 
df['B_min'] = df.groupby(['A']).B.transform(min) 

print (df) 
    A B C B_max B_min 
0 1 5 1  7  5 
1 1 7 1  7  5 
2 1 6 1  7  5 
3 1 7 1  7  5 
4 2 5 1  8  5 
5 2 8 1  8  5 
6 2 6 1  8  5 
7 3 7 1  9  7 
8 3 9 1  9  7 
9 4 6 1  7  1 
10 4 7 1  7  1 
11 4 1 1  7  1 

g = df.groupby('A').B 
df['B_max'] = g.transform(max) 
df['B_min'] = g.transform(min) 

print (df) 
    A B C B_max B_min 
0 1 5 1  7  5 
1 1 7 1  7  5 
2 1 6 1  7  5 
3 1 7 1  7  5 
4 2 5 1  8  5 
5 2 8 1  8  5 
6 2 6 1  8  5 
7 3 7 1  9  7 
8 3 9 1  9  7 
9 4 6 1  7  1 
10 4 7 1  7  1 
11 4 1 1  7  1 
+0

Странно, я дал такую ​​ошибку; ТипError: Объект 'SeriesGroupBy' не поддерживает назначение предметов – anniejcannon

+0

Да, я уверен. – anniejcannon

+0

Извините, была опечатка. Теперь у меня такое предупреждение, EXTras9.py:93: SettingWithCopyWarning: Значение, которое нужно установить на копии среза из DataFrame. Попробуйте использовать .loc [row_indexer, col_indexer] = значение вместо – anniejcannon

Смежные вопросы