Учитывая следующий фрейм данных
data = [[1, 'Yes','A','No','Yes','No','No','No'],
[2, 'Yes','A','No','No','Yes','No','No'],
[3, 'Yes','B','No','No','Yes','No','No'],
[4, 'No','','','','','',''],
[5, 'No','','','','','',''],
[6, 'Yes','C','No','No','Yes','Yes','No'],
[7, 'Yes','A','No','Yes','No','No','No'],
[8, 'Yes','A','No','No','Yes','No','No'],
[9, 'No','','','','','',''],
[10, 'Yes','B','Yes','Yes','No','No','No']]
df = pd.DataFrame(data,columns=['Cust_ID','OrderMade','OrderType','OrderCategoryA','OrderCategoryB','OrderCategoryC','OrderCategoryD'])
+----+-----------+-------------+-------------+------------------+------------------+------------------+------------------+
| | Cust_ID | OrderMade | OrderType | OrderCategoryA | OrderCategoryB | OrderCategoryC | OrderCategoryD |
|----+-----------+-------------+-------------+------------------+------------------+------------------+------------------|
| 0 | 1 | Yes | A | No | Yes | No | No |
| 1 | 2 | Yes | A | No | No | Yes | No |
| 2 | 3 | Yes | B | No | No | Yes | No |
| 3 | 4 | No | | | | | |
| 4 | 5 | No | | | | | |
| 5 | 6 | Yes | C | No | No | Yes | Yes |
| 6 | 7 | Yes | A | No | Yes | No | No |
| 7 | 8 | Yes | A | No | No | Yes | No |
| 8 | 9 | No | | | | | |
| 9 | 10 | Yes | B | Yes | Yes | No | No |
+----+-----------+-------------+-------------+------------------+------------------+------------------+------------------+
Как я могу преобразовать это, чтобы сделать строки на основе OrderCategory
?
+--------+-----------+----------+----------------+
|Cust_ID | OrderMade |OrderType | OrderCategory |
|--------+-----------+----------+----------------|
|1 | Yes | A | OrderCategoryB |
|2 | Yes | A | OrderCategoryC |
|3 | Yes | B | OrderCategoryC |
|4 | No | | |
|5 | No | | |
|6 | Yes | C | OrderCategoryC |
|6 | Yes | C | OrderCategoryD |
|7 | Yes | A | OrderCategoryB |
|8 | Yes | A | OrderCategoryC |
|9 | No | | |
|10 | Yes | B | OrderCategoryA |
|10 | Yes | B | OrderCategoryB |
+--------+-----------+----------+----------------+
Я пытался использовать crosstab
, чтобы начать содин OrderCategory
и планировалось дублировать для каждой категории, но это кажется неэффективным, и я не был уверен, как поступить, чтобы получить желаемый результат ...
imgCROSS = pd.crosstab(df["Cust_ID"], df["OrderCategoryA"])
Возвращает ...
OrderCategoryA No Yes
Cust_ID
1 0 1 0
2 0 1 0
3 0 1 0
4 1 0 0
5 1 0 0
6 0 1 0
7 0 1 0
8 0 1 0
9 1 0 0
10 0 0 1
Я также подумал, что мог бы заполнить новый пустой столбец с именем Category
и выполнить итерацию по каждой строке, заполнив соответствующую категорию на основе значения Yes/No
, но это не будет работать для строк, которые имеют несколько категорий,Кроме того, приведенная ниже реализация этой идеи вернула пустой столбец.
imgRaw["Category"] = ""
for index, row in df.iterrows():
catA = row["OrderCategoryA"]
catB = row["OrderCategoryB"]
catC = row["OrderCategoryC"]
catD = row["OrderCategoryD"]
if catA == "Yes":
row["Category"] = "OrderCategoryA"
elif catB == "Yes":
row["Category"] = "OrderCategoryB"
elif catC == "Yes":
row["Category"] = "OrderCategoryC"
elif catD == "Yes":
row["Category"] = "OrderCategoryD"
Я знаю, что мне нужно преобразовать фрейм данных, возможно, несколько раз, прежде чем я смогу получить желаемый результат.Просто застрял на том, как продолжить.