首页 > 解决方案 > 熊猫如何复制具有不均匀列的数据框中的行,仅在特定列中存在数据并形成具有偶数列的新数据框?

问题描述

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

我想要最终得到的是以下格式的分组数据:

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

我已将空单元格设置为“”,并且数据框的末尾不均匀数据看起来像:

一个 C D
符号1 主机1 主机2 “”
符号2 主机2 主机1 “”
符号3 “” “” “”
符号4 主机1 主机2 “”
符号5 主机1 主机2 主机3
符号6 主机1 主机2 “”

我想要的是一个看起来像这样的数据框:

一个
符号1 主机1
符号1 主机2
符号2 主机2
符号2 主机1
符号4 主机1
符号4 主机2
符号5 主机1
符号5 主机2
符号5 主机3
符号6 主机1
符号6 主机2

标签: pythonpandasdataframe

解决方案


通过使那些空值变得更复杂'""'

国际大学联盟:

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

推荐阅读