如何将键映射到多个值到具有/多个值的数据框列?
How to map key to multiple values to dataframe column w/ multiple values?
我最终想按有多种运输要求的商品与只有 1 种运输要求的商品进行分组。
我有一个 pandas df 列,如下所示:
ID #(column name = ID)
1111
1111,2222
1111,2222
2222,4444,3333
2222,4444
我如何创建一个字典对象或映射层(对所有建议开放),如果它符合条件并更改键值,我可以在其中传递任何值?
例如,如果值为 1111, 4444
,则将其更改为 Express Shipping, Standard Shipping
并使其位于同一数据帧中。
我最终想按有多种运输要求的商品与只有 1 种运输要求的商品进行分组。
1. shipping_num = (1111, 2222, 3333, 4444).
2. shipping_map = (Express shipping, Standard Shipping, 2-day shipping, 1-day shipping)
*NEW_SHIPPING MAP COLUMN*
Express shipping
Express shipping, Standard Shipping
Standard Shipping, 1-day shipping,2-day shipping
Standard Shipping, 1-day shipping
感谢观看!
您可以从 shipping_num
和 shipping_map
创建一个映射字典,然后使用 str.split
+ explode
从 ID
列中获取个人 ID 号.然后使用map
获取航运图;最后使用 groupby
+ agg
恢复原状:
shipping_num = (1111, 2222, 3333, 4444)
shipping_map = ('Express shipping','Standard Shipping', '2-day shipping', '1-day shipping')
mapping = dict(zip(shipping_num, shipping_map))
df['shipping_map'] = df['ID'].str.split(',').explode().astype(int).map(mapping).groupby(level=0).agg(', '.join)
输出:
ID shipping_map
0 1111 Express shipping
1 1111,2222 Express shipping, Standard Shipping
2 1111,2222 Express shipping, Standard Shipping
3 2222,4444,3333 Standard Shipping, 1-day shipping, 2-day shipping
4 2222,4444 Standard Shipping, 1-day shipping
我不是 100% 清楚您希望代码做什么。可能有帮助的一件事是设置像 MyDict = {1111:"Express Shipping",4444:"Standard Shipping}
这样的字典。从那里,您可以执行 df["NewColumn"] = df["ID"].apply(lambda x: MyDict[x])
将数字转换为标签。
但您似乎对使用多个密钥感兴趣?
另一件可能有帮助的事情是暂时将您的“ID”列转换为字符串(例如 df['StrID'] = df['ID'].astype(str)
),然后用逗号“拆分”该列。 (例如 df['StrID'].str.split(',')
这会让你计算每列中的 ID 数量。然后你可以 运行 一个 group-by 超过它。
我最终想按有多种运输要求的商品与只有 1 种运输要求的商品进行分组。
我有一个 pandas df 列,如下所示:
ID #(column name = ID)
1111
1111,2222
1111,2222
2222,4444,3333
2222,4444
我如何创建一个字典对象或映射层(对所有建议开放),如果它符合条件并更改键值,我可以在其中传递任何值?
例如,如果值为 1111, 4444
,则将其更改为 Express Shipping, Standard Shipping
并使其位于同一数据帧中。
我最终想按有多种运输要求的商品与只有 1 种运输要求的商品进行分组。
1. shipping_num = (1111, 2222, 3333, 4444).
2. shipping_map = (Express shipping, Standard Shipping, 2-day shipping, 1-day shipping)
*NEW_SHIPPING MAP COLUMN*
Express shipping
Express shipping, Standard Shipping
Standard Shipping, 1-day shipping,2-day shipping
Standard Shipping, 1-day shipping
感谢观看!
您可以从 shipping_num
和 shipping_map
创建一个映射字典,然后使用 str.split
+ explode
从 ID
列中获取个人 ID 号.然后使用map
获取航运图;最后使用 groupby
+ agg
恢复原状:
shipping_num = (1111, 2222, 3333, 4444)
shipping_map = ('Express shipping','Standard Shipping', '2-day shipping', '1-day shipping')
mapping = dict(zip(shipping_num, shipping_map))
df['shipping_map'] = df['ID'].str.split(',').explode().astype(int).map(mapping).groupby(level=0).agg(', '.join)
输出:
ID shipping_map
0 1111 Express shipping
1 1111,2222 Express shipping, Standard Shipping
2 1111,2222 Express shipping, Standard Shipping
3 2222,4444,3333 Standard Shipping, 1-day shipping, 2-day shipping
4 2222,4444 Standard Shipping, 1-day shipping
我不是 100% 清楚您希望代码做什么。可能有帮助的一件事是设置像 MyDict = {1111:"Express Shipping",4444:"Standard Shipping}
这样的字典。从那里,您可以执行 df["NewColumn"] = df["ID"].apply(lambda x: MyDict[x])
将数字转换为标签。
但您似乎对使用多个密钥感兴趣?
另一件可能有帮助的事情是暂时将您的“ID”列转换为字符串(例如 df['StrID'] = df['ID'].astype(str)
),然后用逗号“拆分”该列。 (例如 df['StrID'].str.split(',')
这会让你计算每列中的 ID 数量。然后你可以 运行 一个 group-by 超过它。