Pandas сводка с заменой значений столбцов из повторяющихся значений строк - PullRequest
2 голосов
/ 05 мая 2020

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

Part  |  Location |  ONHand 
A     |  XY       |  5 
A     |  XW       |  4 
B     |  XC       |  6 
B     |  XV       |  8 
C     |  XQ       |  9 

И я пытаюсь преобразовать все это в одну строку для каждой части, перечисляя все местоположения и количества в каждом месте.

Я пробовал использовать этот код

df_f = df.assign(cc=df.groupby('Part').cumcount()+1).set_index(['Part', 'cc']).unstack()
df_f.columns = [f'{col[0]}{col[1]}' for col in df_f.columns]
df_f.to_csv('parts_multi_location.csv')

Но проблема в том, что он возвращает Location 1, 2, 3, а затем ONHand 1, 2, 3 и т. Д.

Мне нужен конечный результат, чтобы вернуть Location 1, Onhand 1, Location 2, Onhand 2, поэтому заголовки должны выглядеть так:

Part | Location_1 | Onhand_1 | Location 2| Onhand 2
A    | XY         |   5      | XW        | 4
B    | XC         |   6      | XV        | 8
C    | XQ         |   9

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Вы сделали большую часть работы. Не хватает только sort_index:

df_f = df.assign(cc=df.groupby('Part').cumcount()+1).set_index(['Part', 'cc']).unstack()

# this is what you are missing
df_f = df_f.sort_index(level=(1,0), axis=1)

df_f.columns = [f'{col[0]}{col[1]}' for col in df_f.columns]

Вывод:

     Location1  ONHand1 Location2  ONHand2
Part                                      
A           XY      5.0        XW      4.0
B           XC      6.0        XV      8.0
C           XQ      9.0       NaN      NaN
0 голосов
/ 05 мая 2020

IIU C, решение Quang намного приятнее, но давайте посмотрим, как мы могли бы решить эту проблему, используя метод Sorted из стандартной библиотеки.

если вы используете f'{col[0]}_{col[1]}', как предложил Куанг, мы можем разделить _, чтобы получить числовое значение и использовать его для сортировки столбцов.

d = {k : int(k.split('_')[1]) for k in df_f.columns}
#{'Location_1': 1, 'Location_2': 2, 'ONHand_1': 1, 'ONHand_2': 2}


df_f[sorted(d,key=d.get)]
         Location_1  ONHand_1 Location_2  ONHand_2
Part                                          
A            XY       5.0         XW       4.0
B            XC       6.0         XV       8.0
C            XQ       9.0        NaN       NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...