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)
答案 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)
您可以尝试使用apply
和lambda
:
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]