panda dataframe:如何根据th中的值复制其他列中的某些列

2024-06-01 12:54:16 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我正在处理如下数据帧:

   yearStart    2014  2015  2016  2017  2018  2019  
0    2015        0    150   200     0     0     0       
1    2016        0     0    200   140    35    10       
2    2017        0     0     0     20    12    12

一般来说,它是一份包含所有费用的财务报告,从合同签订之日起(“年初”一栏)开始,持续数年

^{pr2}$

如何重塑数据帧,以便以相对日期样式存储合同第一年的数据。在

我尝试在每一行上使用iterrows()并将相关列复制到另一个dataframe中,但这花费了太多时间。。。在

编辑:

好吧,我忘了说,也许在合同的相关期限内一年,价值是0,不应该忘记。要考虑的列在yearStart和end中的日期之间,作为参数给定。输入更像这样:

   0    2015        0    150   200     0    13     0       
   1    2016        0     0    200   140    35     0    10   
   2    2017        0     0     0     20    12     0    12

谢谢你


Tags: 数据编辑dataframe时间样式end费用花费
2条回答

使用带筛选的apply创建新行,然后分配新的列名称

df1 = df.apply(lambda x: pd.Series(x[x!=0].values), 1).fillna(0).astype(int)
df1.columns = df.columns.tolist()[:len(df1.columns)]
df1 = df1.reindex(columns=df.columns, fill_value=0)
print (df1)
   yearStart  2014  2015  2016  2017  2018  2019
0       2015   150   200     0     0     0     0
1       2016   200   140    35    10     0     0
2       2017    20    12    12     0     0     0

如果可以使用更大的数据帧,请使用Divakar函数justify_rows

^{pr2}$

如果需要字符串Years

cols = ['yearStart'] + ['Year+{}'.format(x) for x in range(len(df.columns) - 1)]
df1 = pd.DataFrame(justify_rows(df.values), columns=cols, index=df.index)
print (df1)
   yearStart  Year+0  Year+1  Year+2  Year+3  Year+4  Year+5
0       2015     150     200       0       0       0       0
1       2016     200     140      35      10       0       0
2       2017      20      12      12       0       0       0

编辑:

对于第二个解决方案,需要this solution来选择第一个连续的0

def justify_rows(a, side='left'):
    mask = a.cumsum(axis=1) != 0
    print (mask)
    justified_mask = np.sort(mask,1)
    print (justified_mask)
    if side=='left':
        justified_mask = justified_mask[:,::-1]
    out = np.zeros_like(a) 
    out[justified_mask] = a[mask]
    print (out)
    return out

cols = ['Year+{}'.format(x) for x in range(len(df.columns) - 1)]
df1 = df[['yearStart']].join(pd.DataFrame(justify_rows(df.values[:, 1:]),
                                          columns=cols, index=df.index))
print (df1)
   yearStart  Year+0  Year+1  Year+2  Year+3  Year+4  Year+5
0       2015     150     200       0      13       0       0
1       2016     200     140      35       0       0       0
2       2017      20      12       0       0       0       0
df=df.replace({0:np.nan})
df=df.loc[:,df.isnull().sum(0).ne(3)]

选项1:

^{pr2}$

出局[145]:

   yearStart   2015   2016  2017  2018  2019
0     2015.0  150.0  200.0   0.0   0.0   0.0
1     2016.0  200.0  140.0  35.0  10.0   0.0
2     2017.0   20.0   12.0  12.0   0.0   0.0

选项2:

df.apply(lambda x: sorted(x, key=pd.isnull), 1).fillna(0)


Out[145]: 
   yearStart   2015   2016  2017  2018  2019
0     2015.0  150.0  200.0   0.0   0.0   0.0
1     2016.0  200.0  140.0  35.0  10.0   0.0
2     2017.0   20.0   12.0  12.0   0.0   0.0

相关问题 更多 >