csv 处理互斥列的 Dataframe 的有效方法?

aamkag61  于 2023-06-19  发布在  其他
关注(0)|答案(3)|浏览(100)

作为一个例子,想象一下下面有一个csv

id | a1 | a2 |....| aN | b1 | b2 |....| bM |
___________________________________________
0  |data|data|....|data|None|None|....|None|
1  |data|data|....|data|None|None|....|None|
2  |data|data|....|data|None|None|....|None|
3  |None|None|....|None|data|data|....|data|
4  |None|None|....|None|data|data|....|data|
....

我有N a列和M b列,并且a列和b列是互斥的,即如果在a中有data,那么在b中就没有任何东西了。data在这种情况下主要是字符串或浮点值。
感觉效率很低,我将有M或N个元素,为每一行不包含任何东西。
我可以把上面的数据分成两个不同的 Dataframe ,即

df_a
id | a1 | a2 |....| aN |
________________________
0  |data|data|....|data|
1  |data|data|....|data|
2  |data|data|....|data|

df_b
id | b1 | b2 |....| bM |
________________________
3  |data|data|....|data|
4  |data|data|....|data|

但是我有两个数据框架需要跟踪,而不是一个数据框架。
在不创建臃肿的 Dataframe 的情况下,将数据保持在一起的最有效的方法是什么?如果我也有cd列,解决方案是否有效?
我可以做的一件事是将csv制作成excel工作表,并将b列放在不同的工作表中。但对我来说还是有点笨重。

hfsqlsce

hfsqlsce1#

一个可能的解决方案是使用Sparse data structures(它不存储None值):

txt = """
id    a1    a2    a3     b1     b2     b3
0  10.0  20.0  30.0   None   None   None
1  40.0  50.0  60.0   None   None   None
2  70.0  80.0  90.0   None   None   None
3   None   None   None  100.0  200.0  300.0
4   None   None   None  400.0  500.0  600.0
"""

df = pd.read_csv(StringIO(txt), sep='\s+')

df = df.astype(pd.SparseDtype("float", None))

print(df.memory_usage())

输出:

Index    132
id        60
a1        36
a2        36
a3        36
b1        24
b2        24
b3        24
dtype: int64
xfb7svmp

xfb7svmp2#

@kkawabat,怎么样,首先分离a,b然后分配两个 Dataframe ,一个新的行称为,'TYPE',为df填充TYPE与'a'和TYPE 'b'为其他,然后合并两个 Dataframe ,在这种情况下,你不需要使df列如a1,a2,b1,b2,你可以只做col 1,col 2,.......或者u也可以将TYPE设置为布尔值,并将True称为a,False称为b。

daupos2t

daupos2t3#

这是一个有点古怪,但我最终做的是:
创建一个新的dataframe,列为idtypevalue_dict,其中type是abvalue_dict的值是一个字典,其中的键是所有的列名称和值。比如说

id | a1 | a2 |....| aN | b1 | b2 |....| bM |
___________________________________________
0  |data|data|....|data|None|None|....|None|
1  |data|data|....|data|None|None|....|None|
2  |data|data|....|data|None|None|....|None|
3  |None|None|....|None|data|data|....|data|
4  |None|None|....|None|data|data|....|data|
....

将是:

id | type | value_dict |
___________________________________________
0  | "a"  | {"a1": data, "a2": data, ... "aN": data}|
1  | "a"  | {"a1": data, "a2": data, ... "aN": data}|
2  | "a"  | {"a1": data, "a2": data, ... "aN": data}|
3  | "b"  | {"b1": data, "b2": data, ... "bM": data}|
4  | "b"  | {"b1": data, "b2": data, ... "bM": data}|
....

我用字典作为元素有点奇怪,但这似乎是我能想到的最直观的解决方案。

相关问题