python - 如果定义了数据列限制,则按默认值填充行

标签 python pandas dataframe numpy

我需要根据 StartFinish 列中的信息在 DataFrame 中按默认值 =1 填充行。
因此,填充行中分隔列的限制是根据 ['Start', 'Finish'] 定义的。

DataFrame,df1 是:

ID  Car       Jan17     Jun18  Dec18  Apr19   Start   Finish                           
0   Nissan     0.0       1.7    3.7    0.0    Jun18   Dec18   
1   Porsche    10.0      0.0    2.8    3.5    Jan17   Apr19 
2   Golf       0.0       1.7    3.0    2.0    Jun18   Apr19 
3   Toyota     1.0       0.0    3.0    5.2    Jan17   Apr19 
4   Mazda      0.0       0.0    3.0    4.2    Dec18   Apr19
5   Mercedes   0.0       0.0    0.0    7.2    Apr19   Apr19
6   Passat     0.0       3.0    0.0    0.0    Jun18   Jun18

例如,如果有第 0 行: 开始 = Jun18Finish = Dec18

Jun18Dec18,第 0 行的值应由 1 填充。

我尝试使用 numpy.sign() 函数,但如果 0.0 介于两个非零值之间,则会出现错误结果。

预期结果是df2:

ID  Car       Jan17     Jun18  Dec18  Apr19   Start   Finish                           
0   Nissan     0.0       1.0    1.0    0.0    Jun18   Dec18   
1   Porsche    1.0       1.0    1.0    1.0    Jan17   Apr19 
2   Golf       0.0       1.0    1.0    1.0    Jun18   Apr19 
3   Toyota     1.0       1.0    1.0    1.0    Jan17   Apr19 
4   Mazda      0.0       0.0    1.0    1.0    Dec18   Apr19
5   Mercedes   0.0       0.0    0.0    1.0    Apr19   Apr19
6   Passat     0.0       1.0    0.0    0.0    Jun18   Jun18

最佳答案

get_dummies + 插值

这要求您的列按时间顺序排序,并且理想情况下开始和完成始终存在于列名称中。

df = df.set_index(['ID', 'Car', 'Start', 'Finish'])

s1 = (pd.get_dummies(df.index.get_level_values('Start'))
        .reindex(df.columns, axis=1)
        .replace(0, np.NaN))
s2 = (pd.get_dummies(df.index.get_level_values('Finish'))
        .reindex(df.columns, axis=1)
        .replace(0, np.NaN))

res = s1.combine_first(s2).interpolate(axis=1, limit_area='inside').fillna(0, downcast='infer')
res.index = df.index
res = res.reset_index()

输出res:

   ID       Car  Start Finish  Jan17  Jun18  Dec18  Apr19
0   0    Nissan  Jun18  Dec18      0      1      1      0
1   1   Porsche  Jan17  Apr19      1      1      1      1
2   2      Golf  Jun18  Apr19      0      1      1      1
3   3    Toyota  Jan17  Apr19      1      1      1      1
4   4     Mazda  Dec18  Apr19      0      0      1      1
5   5  Mercedes  Apr19  Apr19      0      0      0      1
6   6    Passat  Jun18  Jun18      0      1      0      0

StartFinish 已经从数据本身派生的情况下(似乎是第一个和最后一个非零列),您可以跳过所有假人并在原始 DataFrame 上使用 where

df = df.set_index(['ID', 'Car', 'Start', 'Finish'])
res = (df.where(df.ne(0))
         .clip(1,1)
         .interpolate(axis=1, limit_area='inside')
         .fillna(0, downcast='infer')
         .reset_index())

关于python - 如果定义了数据列限制,则按默认值填充行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56871902/

相关文章:

python - 打开pyxl : need the max number of rows in a column that has data in Excel

python - 替换列中的某些值以与另一列匹配

R 总开/关时间

python - Pandas 获取部分数据框并对值进行归一化

python - AppEngine 服务器无法导入 atom 模块

python - 在Python中分配数据框中值的渐进计数

python - 加速 Numpy 掩蔽

Python:matplotlib 和 seaborn 之间共享比例

python - 如何在python中执行两个大pandas文件的交叉连接

python - 过滤 Dataframe - 列和行