#python #pandas #dataframe #numpy #dictionary
#python #pandas #фрейм данных #numpy #словарь
Вопрос:
Я пытался добавить новый столбец в свой фрейм данных, используя словарь:
мой фрейм данных выглядит следующим образом:
df = pd.DataFrame({
'Time': [1,2,3,4,5,6,7,8,9,10],
'Code': ['A', 'C', 'X', 'Y', 'A', 'B', 'X', 'A', 'Z', 'L'],
'Value': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
})
и мой dic выглядит так:
dic = {(1,'A',1):"P",(2,'C',2):"O",(3,'X',3):"P",(4,'Y',4):"O",(5,'A',5):"P",(6,'B',6):"O",(7,'X',7):"P",(8,'A',8):"P",(9,'Z',9):"O",(10,'L',10):"O"}
Я провел некоторое исследование о том, как это сделать, и придумал использовать функцию map:
df['final'] = dic[df['Time',"Code","Value"].map(dic)
Но это действительно работает — unhashable type: «Series» ..
Есть ли какой-нибудь способ решить эту проблему? Спасибо, ребята
Ответ №1:
Использовать DataFrame.join
с преобразованием dic
в Series
:
df = df.join(pd.Series(dic).rename('final'), on=['Time','Code','Value'])
print (df)
Time Code Value final
0 1 A 1 P
1 2 C 2 O
2 3 X 3 P
3 4 Y 4 O
4 5 A 5 P
5 6 B 6 O
6 7 X 7 P
7 8 A 8 P
8 9 Z 9 O
9 10 L 10 O
Ответ №2:
Фрагмент кода должен работать для вашего варианта использования.
import pandas as pd
df = pd.DataFrame({
'Time': [1,2,3,4,5,6,7,8,9,10],
'Code': ['A', 'C', 'X', 'Y', 'A', 'B', 'X', 'A', 'Z', 'L'],
'Value': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
})
dic = {(1,'A',1):"P",(2,'C',2):"O",(3,'X',3):"P",(4,'Y',4):"O",(5,'A',5):"P",(6,'B',6):"O",(7,'X',7):"P",(8,'A',8):"P",(9,'Z',9):"O",(10,'L',10):"O"}
df['final'] = df.apply(lambda x: dic.get((x['Time'],x['Code'],x['Value']),''),axis=1)
df
Вывод:
Time Code Value final
0 1 A 1 P
1 2 C 2 O
2 3 X 3 P
3 4 Y 4 O
4 5 A 5 P
5 6 B 6 O
6 7 X 7 P
7 8 A 8 P
8 9 Z 9 O
9 10 L 10 O