【问题标题】:Subset dataframe: taking previous value from the original df but not in the subset子集数据框:从原始df中获取先前的值,但不在子集中
【发布时间】:2019-11-21 10:28:45
【问题描述】:

我有一个如下的数据框:

                        A
2018-10-16 15:11:00     100
2018-10-16 15:11:07     101
2018-10-16 15:11:11     102
2018-10-16 15:11:12     101
2018-10-16 15:11:13     100
2018-10-16 15:11:17     110
2018-10-16 15:11:20     103
2018-10-16 15:11:41     99
2018-10-16 15:11:54     107

还有一个子数据框,如下所示:

                        A
2018-10-16 15:11:11     102
2018-10-16 15:11:20     103
2018-10-16 15:11:41     99

我需要将其转换为以下内容:

                        A       New
2018-10-16 15:11:11     102     101
2018-10-16 15:11:20     103     110
2018-10-16 15:11:41     99      110

即:对于每一行,取原始数据帧中的前一个值,而不是子数据帧中的值

【问题讨论】:

  • 最后一个110 正确吗?因为之前的值是103
  • 正确。因为之前的 (2018-10-16 15:11:20) 也在子集数据帧中。所以正确的值是 2018-10-16 15:11:17 中不在子集 df 中的值

标签: python python-3.x pandas dataframe


【解决方案1】:

concat按索引值与默认外连接和DataFrame.shifted原始值一起使用,然后将匹配的值替换为缺失并转发填充它们,最后通过A列删除缺失值的行:

df = pd.concat([df_subset['A'], df['A'].shift()], axis=1, keys=('A','new'), sort=True)
df['new'] = df['new'].mask(df['new'].isin(df['A'])).ffill()
df = df.dropna(subset=['A'])
print (df)
                         A    new
2018-10-16 15:11:11  102.0  101.0
2018-10-16 15:11:20  103.0  110.0
2018-10-16 15:11:41   99.0  110.0

【讨论】:

  • 2018-10-16 15:11:41 的值必须是 110。不是 103
  • @Alfonso_MA - 你能解释更多吗?
【解决方案2】:

我终于做到了:

df:

    A
1   1000
2   1000
3   1001
4   1001
5   10
6   1000
7   1010
8   9
9   100000
10  6
11  999
12  10110
13  10111
14  1000

子网_df:

    A
5   10
8   9
9   100000
10  6
12  10110
13  10111

.

subnet_indexs = subnet_df.index
aux_df = df.copy()
aux_df['NEW'] = aux_df['A']
aux_df.loc[subnet_indexs, new_column_name] = np.nan
aux_df[new_column_name].fillna(method='ffill', inplace=True)
subnet_df = aux_df.loc[subnet_indexs]

.

    A       NEW
5   10      1001.0
8   9       1010.0
9   100000  1010.0
10  6       1010.0
12  10110   999.0
13  10111   999.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2015-05-10
    • 2022-10-20
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2023-02-13
    相关资源
    最近更新 更多