python - 熊猫如何复制具有不均匀列的数据框中的行,仅在特定列中存在数据并形成具有偶数列的新数据框?
问题描述
我有一个不均匀数据的熊猫数据框,我想将其标准化为行,以便对数据进行分组。前 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 |
解决方案
通过使那些空值变得更复杂'""'
。
国际大学联盟:
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
推荐阅读
- security - 将加密数据保存在服务器中。服务器无法读取实际数据
- google-chrome-extension - Chrome 扩展 100% 无法检测到
- java - 把它翻译成英文
- java - 不存在类型变量的实例,因此 Object 确认为 Number
- c++ - C++ 写入 CSV 文件
- android - 如何将可流动列表转换为具有上一项累积总和的新可流动列表
- powershell - 需要使用 powershell 脚本比较两个 CSV 文件
- powerbi - 如何将 Power Bi 报表生成器 v15.6 连接到 Power Bi 报表服务器
- json - Powershell - 创建一个基本的 JSON 文件
- python - 在树莓派 4 上安装 TensorFlow 2.3.0