熊猫:如何在列表列中映射值?

时间:2018-09-10 02:40:18

标签: python pandas

pandas数据框中的一列包含值列表。

使用字典,我想使用字典创建一个具有映射值的新列,对于不在字典中的任何值,将删除这些值。

这是一个最小的示例:

设置数据框

package main

import (
    "fmt"
    "encoding/json"
)

type Configuration struct {
    App   App `json:"app"`
    Items []Item `json:"items"`
}

type App struct {
    Name    string `json:"name"`
    Version int    `json:"version"`
}

type Item struct {
    Type string `json:"type"`
    // What to put here to mantain the field a string so I can Unmarshal later?
    // Inputs string
}

var myJson = `
{
    "app": {
        "name": "name-of-app",
        "version": 1
    },
    "items": [
        {
            "type": "type-of-item",
            "inputs": {
                "input1": "value1"
            }
        }
    ]
}
`

func main() {
    data := Configuration{}
    json.Unmarshal([]byte(myJson), &data)

    fmt.Println("done!", data)
    // Loop through data.Items and use the type to define what to call, and pass inputs
    // as argument
}

结果

df = pd.DataFrame(data={ 'B': ['x', 'y', 'z']})
df.at[0, 'B'] = ['jki', 'gg4', 'k6k']
df.at[1, 'B'] = ['2f4', 'gg4', 'g24']
df.at[2, 'B'] = ['1k1', 'g24', '1k1', '2f4']

设置字典

df

      B
0   [jki, gg4, k6k]
1   [2f4, gg4, g24]
2   [1k1, g24, 1k1, 2f4]

如果该列不是列表,则将使用此代码

conv = { 'jki': 1, 'gg4': 2, '2f4': 3 , 'g24':4, }

但是由于该列包含列表,所以无法使用该代码

这就是我想要的结果

df['MappedA'] = df.B.map(conv)

3 个答案:

答案 0 :(得分:4)

您可以使用lambda函数,并为每个行列表应用map函数来获取字典值

df.B.apply(lambda x:list(filter(None,map(conv.get,x))))

出局:

0       [1, 2]
1    [3, 2, 4]
2       [4, 3]
Name: B, dtype: object

答案 1 :(得分:2)

您可以尝试使用applylambda

df['MappedA'] = df.B.apply(lambda row: [conv[v] for v in row if conv.get(v)])

输出:

                      B    MappedA
0       [jki, gg4, k6k]     [1, 2]
1       [2f4, gg4, g24]  [3, 2, 4]
2  [1k1, g24, 1k1, 2f4]     [4, 3]

答案 2 :(得分:2)

使用嵌套列表理解和字典查找:

df.assign(mapped=[[conv[k] for k in row if conv.get(k)] for row in df.B])

                      B     mapped
0       [jki, gg4, k6k]     [1, 2]
1       [2f4, gg4, g24]  [3, 2, 4]
2  [1k1, g24, 1k1, 2f4]     [4, 3]