【问题标题】:pandas how to duplicate rows in a dataframe with uneven columns, only where data exists in specific column and form new dataframe with even columns?熊猫如何复制具有不均匀列的数据框中的行,仅在特定列中存在数据并形成具有偶数列的新数据框?
【发布时间】:2021-03-25 02:37:41
【问题描述】:

我有一个包含不均匀数据的 pandas 数据框,我想将其标准化为行,以便对数据进行分组。前 x 列已填充且长度固定,但随后将有未定义数量的其他列。此数据是从 csv 文件中读取的,其中每个符号可以有多个或没有主机。

我想要以以下格式分组数据:

{"host1": [sym1, sym2, sym3], "host3": [sym5]}

我已将空单元格设置为“”,我的数据框末尾的不均匀数据如下所示:

A B C D
sym1 host1 host2 ""
sym2 host2 host1 ""
sym3 "" "" ""
sym4 host1 host2 ""
sym5 host1 host2 host3
sym6 host1 host2 ""

我想要的是一个如下所示的数据框:

A B
sym1 host1
sym1 host2
sym2 host2
sym2 host1
sym4 host1
sym4 host2
sym5 host1
sym5 host2
sym5 host3
sym6 host1
sym6 host2

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    将这些空值设置为'""' 会使事情变得更复杂。

    IIUC:

    df.mask(df.eq('""')).melt('A').rename(columns={'value': 'B'})[['A', 'B']].dropna()
    
           A      B
    0   sym1  host1
    1   sym2  host2
    3   sym4  host1
    4   sym5  host1
    5   sym6  host1
    6   sym1  host2
    7   sym2  host1
    9   sym4  host2
    10  sym5  host2
    11  sym6  host2
    16  sym5  host3
    

    df.mask(df.eq('""')).set_index('A').stack().reset_index('A', name='B')
    
          A      B
    B  sym1  host1
    C  sym1  host2
    B  sym2  host2
    C  sym2  host1
    B  sym4  host1
    C  sym4  host2
    B  sym5  host1
    C  sym5  host2
    D  sym5  host3
    B  sym6  host1
    C  sym6  host2
    

    我更喜欢

    dat = [
        {'A': a, 'B': b}
        for a, *B in zip(*map(df.get, df))
        for b in B if b != '""' and b
    ]
    
    pd.DataFrame(dat)
    
           A      B
    0   sym1  host1
    1   sym1  host2
    2   sym2  host2
    3   sym2  host1
    4   sym4  host1
    5   sym4  host2
    6   sym5  host1
    7   sym5  host2
    8   sym5  host3
    9   sym6  host1
    10  sym6  host2
    

    【讨论】:

    • 如果数据框中有其他列,我想在新行中返回,我将如何扩展它?即我有 A、0、1、2、3、...# B、C、D 列,其中 A 和 0 到 # 完全没有 Nan 或 "" 值?例如:d = {"sym": ["sym1", "sym2"], "i_type": ["s", "s"], "isin": ["blah", "blah"], "A": ["host1", "host1"], "B": ["host2", ""]}
    猜你喜欢
    • 2015-03-29
    • 2022-11-15
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2013-06-29
    相关资源
    最近更新 更多