熊猫-如何添加带有跳过行的条目的列?

时间:2019-12-20 19:45:15

标签: python pandas indexing time-series

我有三个时间序列数组。其中有两个具有3小时间隔的值,而有一个具有6小时间隔的值。我想将它们全部添加到同一数据帧中,以方便地进行时间序列图绘制,并将时间戳设置为索引,但是我不确定如何添加6小时间隔数组以跳过行,以便将值放置在正确的时间。

我在下面有一个可行的例子。

import pandas as pd

A = [ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]
B = [11., 12., 13., 14., 15., 16., 17., 18., 19., 20.]
C = [ 2.,  4.,  6.,  8., 10.                         ]

data = { 'A_col': A,
         'B_col': B
       }
df   = pd.DataFrame(data,columns=['A_col','B_col'])
print(df)
   A_col  B_col
0    1.0   11.0
1    2.0   12.0
2    3.0   13.0
3    4.0   14.0
4    5.0   15.0
5    6.0   16.0
6    7.0   17.0
7    8.0   18.0
8    9.0   19.0
9   10.0   20.0

基本上,我想将C添加为列,并使其值出现在索引1、3、5等处,以与A_col的值对齐。我如何有效地做到这一点?熊猫告诉我,每列的大小必须相同。 (我正在使用的实际时间序列数组很长。)我希望它生成一个时间序列图,其中所有值都沿x轴位于正确的位置。

注意:我是熊猫的新手,但是对numpy有更多的经验。

3 个答案:

答案 0 :(得分:3)

此行的内容:

df['C'] = np.nan
df.iloc[1::2, -1] = C    
print(df)

输出:

   A_col  B_col     C
0    1.0   11.0   NaN
1    2.0   12.0   2.0
2    3.0   13.0   NaN
3    4.0   14.0   4.0
4    5.0   15.0   NaN
5    6.0   16.0   6.0
6    7.0   17.0   NaN
7    8.0   18.0   8.0
8    9.0   19.0   NaN
9   10.0   20.0  10.0

答案 1 :(得分:0)

您可以为奇数创建一个真相系列,然后对它们进行分组以设置所需的值:

df['Truth'] = df['A_col'] % 2 == 1

   A_col  B_col  Truth
0    1.0   11.0   True
1    2.0   12.0  False
2    3.0   13.0   True
3    4.0   14.0  False
4    5.0   15.0   True
5    6.0   16.0  False
6    7.0   17.0   True
7    8.0   18.0  False
8    9.0   19.0   True
9   10.0   20.0  False

这里有两个示例说明您可以如何使用它,因为我不确定您要达到的目标,但是我希望这对您有帮助:

df.loc[df['Truth'] == True, 'Truth'] = df.loc[df['Truth']].groupby(df['Truth']).cumsum()
df.loc[df['Truth'] == False, 'Truth'] = df.loc[df['Truth'] == False]['A_col']

   A_col  B_col  Truth
0    1.0   11.0      1
1    2.0   12.0      2
2    3.0   13.0      2
3    4.0   14.0      4
4    5.0   15.0      3
5    6.0   16.0      6
6    7.0   17.0      4
7    8.0   18.0      8
8    9.0   19.0      5
9   10.0   20.0     10

这对您如何处理所需的价值分组有意义吗?如果您提供有关最终结果的信息,我可以修改我的解决方案以匹配它,

答案 2 :(得分:0)

import pandas as pd

A = [ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]
B = [11., 12., 13., 14., 15., 16., 17., 18., 19., 20.]
C = [ 2.,  4.,  6.,  8., 10.                         ]

data = { 'A_col': A,
         'B_col': B
       }
df   = pd.DataFrame(data,columns=['A_col','B_col','C_col'])

C_iterator=0
df_size = len(df)
for position in range(df_size):
    if position%2 !=0:
        df['C_col'].loc[position] = C[C_iterator]
        C_iterator+=1
    else:
        pass

df['C_col']=df['C_col'].astype(float)
print(df)

   A_col  B_col  C_col
0    1.0   11.0    NaN
1    2.0   12.0    2.0
2    3.0   13.0    NaN
3    4.0   14.0    4.0
4    5.0   15.0    NaN
5    6.0   16.0    6.0
6    7.0   17.0    NaN
7    8.0   18.0    8.0
8    9.0   19.0    NaN
9   10.0   20.0   10.0