Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For循环替换Python_Python_For Loop_Pandas - Fatal编程技术网

For循环替换Python

For循环替换Python,python,for-loop,pandas,Python,For Loop,Pandas,巨蟒和熊猫新手在这里!我正在尝试使用for循环转置包含一百万条记录的数据帧。正如你所能想象的,它的速度非常缓慢。 有关我的流程和代码,请参见下文 我正在处理两个数据帧: 交易记录-包含客户id及其购买的类别 transactions=pandas.DataFrame({'a':['johnny','sally','maggy','lassy','johnny','sally','maggy'], 'category':['fruits','fruits','spices','veggies','

巨蟒和熊猫新手在这里!我正在尝试使用for循环转置包含一百万条记录的数据帧。正如你所能想象的,它的速度非常缓慢。 有关我的流程和代码,请参见下文

我正在处理两个数据帧: 交易记录-包含客户id及其购买的类别

transactions=pandas.DataFrame({'a':['johnny','sally','maggy','lassy','johnny','sally','maggy'],
'category':['fruits','fruits','spices','veggies','veggies','spices','snacks']})
类别列表-包含客户可以从中购买的所有类别

category_list=pandas.DataFrame({'category':['fruits','spices','veggies','snacks','drinks','alcohol','adult']})
对于每个客户,如果该客户(曾经)在给定类别中进行过购买,则将值指定为1。如果不是,则将值指定为0

代码:

因此,在这种情况下,结果如下所示:

print final_data
如果我能得到任何帮助来优化它,使它运行得更快,代码行更少,我将不胜感激


谢谢。

您的问题可以看作是枢轴操作,这里我们可以使用:

# Get a unique list of all category items.
categories = category_list.category.unique().tolist()

# For transactions with a given customer matching any category, assign a value of one.
transactions['value'] = transactions.groupby('a').category.transform(
                            lambda s: s.isin(categories).any()).astype(int)
output = transactions.groupby(['a', 'category']).max().unstack().fillna(0)
output.columns = output.columns.droplevel()
zero_cols = [c for c in categories if c not in output]
for col in zero_cols:
    output[col] = 0
>>> output
category  fruits  snacks  spices  veggies  drinks  alcohol  adult
a                                                                
johnny         1       0       0        1       0        0      0
lassy          0       0       0        1       0        0      0
maggy          0       1       1        0       0        0      0
sally          1       0       1        0       0        0      0
pivot\u表本身为我们提供了

>>> P
category  fruits  snacks  spices  veggies
a                                        
johnny         1     NaN     NaN        1
lassy        NaN     NaN     NaN        1
maggy        NaN       1       1      NaN
sally          1     NaN       1      NaN

然后,我们使用所有类别列(包括未看到的列)对此进行索引,调用
fillna
将NaN替换为0。

您的问题可以被视为一个透视操作,这里我们可以使用:

pivot\u表本身为我们提供了

>>> P
category  fruits  snacks  spices  veggies
a                                        
johnny         1     NaN     NaN        1
lassy        NaN     NaN     NaN        1
maggy        NaN       1       1      NaN
sally          1     NaN       1      NaN

然后我们使用所有的分类列(包括那些看不到的列)对此进行索引,调用
fillna
将NaN替换为0。

谢谢。但是这并没有得到转置矩阵。谢谢Alexander。对我的示例数据使用了您的解决方案,结果与我发布的代码不同。我的最终输出应该与我在final_dataSorry中的输出相同。如果您已从该类别订购,则这些值为。谢谢,谢谢。但是这并没有得到转置矩阵。谢谢Alexander。对我的示例数据使用了您的解决方案,结果与我发布的代码不同。我的最终输出应该与我在final_dataSorry中的输出相同。如果您已从该类别订购,则这些值为。谢谢,哇!这太疯狂了。即使代码明显减少!我想两个都打勾,但我要给跑得最快的那个打勾。你们真是太棒了。你们花了不到一分钟的时间就录制了近200万张唱片!我同意DSM的表演!另一个解决方案耗时10分钟,仍然比我的for循环快100000倍!堆石头!哇!这太疯狂了。即使代码明显减少!我想两个都打勾,但我要给跑得最快的那个打勾。你们真是太棒了。你们花了不到一分钟的时间就录制了近200万张唱片!我同意DSM的表演!另一个解决方案耗时10分钟,仍然比我的for循环快100000倍!堆石头!
>>> P
category  fruits  snacks  spices  veggies
a                                        
johnny         1     NaN     NaN        1
lassy        NaN     NaN     NaN        1
maggy        NaN       1       1      NaN
sally          1     NaN       1      NaN