我有一个数据框,其中每一行都是公司,列是每月收入,就像这样。
import pandas as pd
from io import StringIO
data='''
Company jan feb mar apr may jun jul aug sep oct nov dec CHURN
Dell nan nan nan 600 550 620 nan nan 300 100 200 50
Sony 740 720 780 700 250 140 20 nan nan nan nan nan
Toshiba nan nan nan nan 400 550 nan 500 nan 40 50 nan
Apple nan 300 350 300 400 500 nan nan nan nan nan nan
Acer 150 200 250 200 50 50 40 35 30 20 10 nan'''
df=pd.read_csv(StringIO(data),delimiter='\s+')
我需要计算这些公司(部分)流失的时间,如果他们这样做的话。我的定义如下。
结果将如下所示。
Company jan feb mar apr may jun jul aug sep oct nov dec CHURN
--------------------------------------------------------------------------------
Dell nan nan nan 600 550 620 nan nan 300 100 200 50
Sony 740 720 780 700 250 140 20 nan nan nan nan nan may
Toshiba nan nan nan nan 400 550 nan 500 nan 40 50 nan
Apple nan 300 350 300 400 500 nan nan nan nan nan nan jul
Acer 150 200 250 200 50 50 40 35 30 20 10 nan may
编辑:
我要去iloc[]
并嵌套for循环
firstrevenue=0
for row in range(0,len(df.index)-1):
for col in range(1,12):
if df.iloc[row,col].values > 0:
if firstrevenue = 0:
firstrevenue=col
但罗马佩卡尔想出了一些更好的东西。问题已解决。
答案 0 :(得分:1)
不确定您是否可以使用pandas.Series.rolling
轻松完成,但您可以使用自定义功能和pandas.DataFrame.apply
完成此操作:
>>> def worker(x):
... for i in range(1, len(x) - 6):
... d = x[i:i+4]
... if not d.isnull().values.any():
... if x[i+4:i+6].fillna(0).max() < d.mean()/2:
... return i+4
...
>>> df.apply(worker, axis=1)
0 NaN
1 5.0
2 NaN
3 7.0
4 5.0