Pandas-如何添加条目跳过行的列?

Posted

技术标签:

【中文标题】Pandas-如何添加条目跳过行的列?【英文标题】:Pandas- How to add a column with entries skipping rows? 【发布时间】:2020-04-13 06:47:38 【问题描述】:

我有三个时间序列数组。其中两个具有 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 的值对齐。我如何有效地做到这一点? Pandas 告诉我每列的大小必须相同。 (我正在使用的实际时间序列数组很长。)我希望它生成一个时间序列图,其中所有值都位于 x 轴的正确位置。

注意-我对 pandas 比较陌生,但对 numpy 有更多的经验。

【问题讨论】:

我首先想到的就是resample的数据要匹配相同长度的索引 视情况而定,你想如何填补缺失的时间步?零?什么意思? 假设 df.plot 将跳过 NaN,那将是首选。我绝对不希望它们为零,因为这将被解释为 0 的实际值。 那我想你下面已经有答案了:) NaN 答案替换了 C 的值,我不想这样做。 【参考方案1】:

类似的东西:

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

【讨论】:

通过用 NaN 替换 C 的值,这不会保留 C 中的值。我希望 C 保留其值,但将它们插入到我指示的索引处的数据框中。 只传递C 而不是range(5) 谢谢,这让数据框按照我想要的方式填充,然后我使用 Markus Dutschke 对这个问题的回答来制作情节-***.com/questions/14399689/…【参考方案2】:
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

【讨论】:

【参考方案3】:

您可以为奇数和分组创建一个真值系列以设置您需要的值:

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

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

【讨论】:

以上是关于Pandas-如何添加条目跳过行的列?的主要内容,如果未能解决你的问题,请参考以下文章

通过 pandas.read_excel 在标题后跳过行范围

在 csv 导入 pandas 期间跳过行

Python Pandas,读取文件并在标题前跳过行

如果满足条件,Pandas iterrows 在迭代期间不能跳过行

Excel中具有偏移(跳过线)的动态范围

如何从mysql中的表中跳过行