Панды питона: Более быстрый способ, чем numpy.выберите?

#pandas #dataframe #numpy #select

Вопрос:

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

       GebTyp BAK
0         RH   C
1        MFH   A
2         RH   J
3         RH   F
4         RH   K
...      ...  ..
25046    MFH   C
25047    MFH   G
25048    MFH   I
25049    MFH   A
25050    MFH   B
 

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

    BAK  EFH/DHH     RH    MFH    GMH     HH
0    A    231.0  222.0  265.0  186.0  156.0
1    B    271.0  222.0  204.0  186.0  156.0
2    C    214.0  186.0  222.0  197.0  167.0
3    D    242.0  183.0  236.0  201.0  171.0
4    E    184.0  155.0  188.0  196.0  143.0
5    F    198.0  179.0  162.0  158.0  121.0
6    G    134.0  145.0  138.0  134.0  104.0
7    H    159.0  118.0  143.0  103.0   73.0
8    I    120.0  110.0  119.0   97.0   87.0
9    J     91.0   89.0   86.0   75.0   69.0
10   K      NaN    NaN    NaN    NaN    NaN
11   L      NaN    NaN    NaN    NaN    NaN
 

Я могу правильно присвоить каждому отдельному значению numpy.select вот так:

 def GWB()
    conditions = [
        (mc["BAK"] == "A" amp; mc["GebTyp"] == "EFH/DHH"),
        (mc["BAK"] == "A" amp; mc["GebTyp"] == "RH"),
        (mc["BAK"] == "A" amp; mc["GebTyp"] == "MFH"),
        (mc["BAK"] == "A" amp; mc["GebTyp"] == "GMH"),
        (mc["BAK"] == "A" amp; mc["GebTyp"] == "HH"),
    ]

    values = [
        (231),
        (222),
        (265).
        (186),
        (156)
    ]
    df["result"] = np.select(conditions,values)
GWB()
 

Но это привело бы к примерно 80 строкам кода, также в этом случае я работаю только с первым кадром данных, присваивая значения вручную. Мне было интересно, будет ли более быстрый/короткий способ выполнить эту задачу?

Ответ №1:

Используйте DataFrame.merge с DataFrame.melt :

 df = df1.merge(df2.melt('BAK', value_name='result', var_name='GebTyp'), 
          how='left', 
          on=['BAK','GebTyp'])
print (df)
   GebTyp BAK  result
0      RH   C   186.0
1     MFH   A   265.0
2      RH   J    89.0
3      RH   F   179.0
4      RH   K     NaN
5     ...  ..     NaN
6     MFH   C   222.0
7     MFH   G   138.0
8     MFH   I   119.0
9     MFH   A   265.0
10    MFH   B   204.0
 

Комментарии:

1. Будет ли это также работать, если у меня есть несколько других столбцов в df1? Не упоминал о них, чтобы не подчеркивать масштаб вопроса

2. @Jonas — Я думаю, что да, но также возможно добавить on параметр для набора столбцов для объединения.