Python 循环并累积由列表组成的列的总和
目前,我的Pandas数据框如下所示 第X排 [“中”、“高”、“低”] [“中等”]Python 循环并累积由列表组成的列的总和,python,pandas,Python,Pandas,目前,我的Pandas数据框如下所示 第X排 [“中”、“高”、“低”] [“中等”] 将函数映射到序列 import pandas as pd def function(x): summation = 0 for i in x: if "High" in i: summation += 10 elif "Medium" in i: summation +=
将函数映射到序列
import pandas as pd
def function(x):
summation = 0
for i in x:
if "High" in i:
summation += 10
elif "Medium" in i:
summation += 5
else:
summation += 0
return summation
df = pd.DataFrame({'raw_x': [['Medium', 'High', 'Low'], ['Medium']]})
df['row_y'] = df['raw_x'].map(function)
您可以使用以下命令以较短的格式执行此操作:
mapping = {'High': 10, 'Medium': 5, 'Low': 0}
df['raw_y'] = df['raw_x'].map(lambda x: sum([mapping[i] if i in mapping else 0 for i in x]))
我们可以做到:
mapper = {'Medium' : 5, 'High' : 10}
如果熊猫版本>0.25.0我们可以使用
df['Row_Y'] = df['Row_X'].explode().map(mapper).sum(level=0)
这个解决方案应该有效-
vals={“高”:10,“中”:5,“低”:0}
df['Row_Y']=df.apply(lambda Row:sum(vals[i]表示第['Row_X']行中的i),轴=1)
可能在更干净的一面,转换成系列
并直接使用地图
mapp = {'Medium' : 5, 'High' : 10}
df['Row_Y'] = df['Row_X'].apply(lambda x: pd.Series(x).map(mapp).sum())
df
Row_X Row_Y
0 [Medium, High, Low] 15.0
1 [Medium] 5.0
小心,
sum
是一个bult-in-functionGood调用,更改了示例。在处理pandas时,始终尝试避免重复数据帧。使用apply-instead歉意,添加for循环以反映我希望完成的累积求和。这会彻底改变映射吗?如果我在映射中为避免键错误
添加好主意,added@ask39检查df['ask']。应用(类型)。等式(列表)
如果得到错误,请告诉我们是的,这是最好的方法。使用map进行迭代和求和是最好的方法approach@JoeFerndz应用是一个循环并创建一个pd。每行中的系列都是无效的,在我看来,使用map和应用的其他解决方案更有效。我看到@ansev响应。这是一个很好的解决方案。良好的学习是最好的解决方法o我更喜欢使用explode/groupbyNow与sum(level=0)
I忘了@Kenan
df['Row_Y'] = df['Row_X'].explode().map(mapper).sum(level=0)
print(df)
Row_X Row_Y
0 [Medium, High, Low] 15
1 [Medium] 5
mapp = {'Medium' : 5, 'High' : 10}
df['Row_Y'] = df['Row_X'].apply(lambda x: pd.Series(x).map(mapp).sum())
df
Row_X Row_Y
0 [Medium, High, Low] 15.0
1 [Medium] 5.0