【问题标题】:Multiply / divide dataframe columns by list / series along axis 1沿轴 1 将数据帧列乘以列表/系列
【发布时间】:2022-11-24 02:09:36
【问题描述】:

我有一个包含 N 列的数据框,其中 N 可能为 0。我有一个标量值列表,其长度与数据框中的列列表相同。我想将数据框的列乘以或除以列表中的相应值。

例如。

Dataframe

    1  2  3
1   1  2  3
2   4  5  6
3   7  8  9

Multipliers

0 1 2

Expected

   1  2  3
1  0  2  6
2  0  5 12
3  0  8 18

让我们创建数据

# Empty
df_1 = pd.DataFrame({}, index=idx)
list_1 = []
series_1 = pd.Series(list_1, dtype=float)

# Not empty (1 element to shorten example)
df_2 = pd.DataFrame({1: [1]}, index=idx)
list_2 = [12]
series_2 = pd.Series(list_2, dtype=float)

当我将乘数作为列表传递时,它按预期工作

df_2.mul(list_2)
    1
1  12

但是,如果列表为空,我会收到警告

df_1.mul(list_1, axis=1)
<stdin>:1: FutureWarning: The default dtype for empty Series will be 'object' instead of 'float64' in a future version. Specify a dtype explicitly to silence this warning.
Empty DataFrame
Columns: []
Index: [1]

所以我试图将列表作为一个系列传递。当系列为空时我没有收到任何警告

df_1.mul(series_1, axis=1)
Empty DataFrame
Columns: []
Index: [1]

但这显然不是正确的做法,因为在传递系列时,系列索引与列名匹配。

df_2.mul(series_2)
    0   1
1 NaN NaN

我想依赖列顺序,就像列表一样。

我怎样才能做到这一点?我对清单没意见。我只想面向未来,所以我想摆脱警告。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这是一种(hacky)方法:

    import pandas as pd
    
    def helper(df, other, *args, **kwargs):
        if isinstance(other, list) and not other:
            return pd.DataFrame()
        return mul(df, other, **kwargs)
    
    
    mul = pd.DataFrame.mul
    pd.DataFrame.mul = helper
    
    
    df_1 = pd.DataFrame({})
    list_1 = []
    
    df_2 = pd.DataFrame({1: [1]})
    list_2 = [12]
    

    然后:

    print(df_2.mul(list_2))
    
        1
    0  12
    
    print(df_1.mul(list_1, axis=1))
    
    # No warning
    Empty DataFrame
    Columns: []
    Index: []
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-16
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 2021-07-30
      • 1970-01-01
      相关资源
      最近更新 更多