【问题标题】:Create new data.frame based on binary (0/1) data.frame基于二进制 (0/1) data.frame 创建新的 data.frame
【发布时间】:2021-11-01 18:24:17
【问题描述】:

我有两个 data.frame(df1 和二进制 df2),我想创建基于 df1 的第三个 data.frame (df3),条件是二进制 data.frame df2。如果二进制数据帧 2 中的该位置为零,我想将所有值设置为零。

import pandas as pd
df1 = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
    '01K W':[1.2, 2.3, 0.3, 0.5], 
    '02K W':[3.5, 0.1, 'nan', 'nan'], 
    '03K W':[4.2, 5.2, 2.5, 3.0], 
    '04K W':[1.5, 2.6, 8.2, 4.2]})

df2 = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
    '01K W':[1, 1, 1, 1], 
    '02K W':[1, 0, 0, 0], 
    '03K W':[0, 0, 0, 1], 
    '04K W':[0, 1, 1, 0]}) 

为了创建新的 data.frame 3,我正在考虑对列进行 for 循环,并根据 df2 (values=0) 替换 df1 中的值。到目前为止,我无法找出正确的语法。

df3 = for col in df1.columns:
    if df2[col].value[1:] == 0:
        df3[col].value[1:] = 0
    else:
        df3[col].value[1:] = df1[col].value 

我希望 data.frame 看起来像这样:

df3 = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
    '01K W':[1.2, 2.3, 0.3, 0.5], 
    '02K W':[3.5, 0, 0, 0], 
    '03K W':[0, 0, 0, 3.0], 
    '04K W':[0, 2.6, 8.2, 0]}) 

非常感谢您的帮助:)

【问题讨论】:

  • DataFrame 的值是字符串吗?
  • 感谢您指出这一点,实际上这些值不是数字。

标签: python pandas dataframe


【解决方案1】:

您可以通过 df2 索引 df1。由于df2是string dtype,所以先转成boolean。

df2_bool = df2.set_index('Date').astype(int).astype(bool)

df1.set_index('Date')[df2_bool].fillna(0).reset_index()

你得到

    Date        01K W   02K W   03K W   04K W
0   2021-01-01  1.2     3.5     0       0
1   2021-01-02  2.3     0       0       2.6
2   2021-01-03  0.3     0       0       8.2
3   2021-01-04  0.5     0       3.0     0

当然,您可以将其设为单行(并避免保存布尔值 df2)

df1.set_index('Date')[df2.set_index('Date').astype(int).astype(bool)].fillna(0).reset_index()

【讨论】:

  • 非常感谢您的回答,效果很好!
【解决方案2】:

你可以这样做:

bm = df2.sort_values('Date').set_index('Date').astype(int).astype(bool).values

df1.sort_values('Date').set_index('Date').where(bm, 0).reset_index()

基本上你创建一个二进制矩阵:

df2.sort_values('Date').set_index('Date').astype(int).astype(bool).values

然后你使用 pandas where 子句。

注意:这仅在所有日期都在 df1df2 时才有效。

【讨论】:

  • 感谢您的回答,是的,在我的情况下日期匹配。
【解决方案3】:

下面的代码可以工作。

df1 = df1.set_index('Date').astype(float)
df2 = df2.set_index('Date').astype(float)
df1.fillna(0,inplace=True)
df3 = df1 * df2

如果 df2 也有空值,您可以使用 fillna()。

运算是一个简单的矩阵乘法。

你也可以这样做。

df1.mul(df2)

【讨论】:

  • 非常感谢,我没想到这么直观的解决方案 :)
  • 谢谢,您可以考虑验证此解决方案 :)
猜你喜欢
  • 2014-04-08
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 2013-10-14
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
相关资源
最近更新 更多