gpt4 book ai didi

pandas - 根据现有列将多行和单列添加到 Dataframe

转载 作者:行者123 更新时间:2023-12-02 07:18:21 24 4
gpt4 key购买 nike

我想添加新行并在现有列的基础上添加新列。例如,假设我有以下数据框:

   A          B
1 a
2 b
3 c
4 b

以及一个以唯一列 B 值作为键的字典。每个键都与一个值列表相关联。这些值用于新的行和列:{a: [x, y, z], b: [x, w, r], c: [x, q]}

转换应产生以下数据框:

   A          C          
1 x
1 y
1 z
2 x
2 w
2 r
3 x
3 q
4 x
4 w
4 r

我知道如何添加新列,但我无法尝试复制行。这个问题最有效的解决方案是什么?我是更新现有 Dataframe 还是创建一个新 Dataframe?

更新

该操作将使用 Dask 在大型数据帧(超过 2000 万行)上使用。

最佳答案

我建议使用 mapnp.repeatchain.from_iterable 创建新的:

d = {'a': ['x', 'y', 'z'], 'b': ['x', 'w', 'r'], 'c': ['x', 'q']}

s = df['B'].map(d)
lens = [len(x) for x in s]

from itertools import chain

df = pd.DataFrame({
'A' : df['A'].values.repeat(lens),
'C' : list(chain.from_iterable(s.values.tolist()))
})
print (df)
A C
0 1 x
1 1 y
2 1 z
3 2 x
4 2 w
5 2 r
6 3 x
7 3 q
8 4 x
9 4 w
10 4 r

如果字典的某些值不匹配,更通用的解决方案:

第一个解决方案返回错误,因为map返回缺失值:

TypeError: object of type 'NoneType' has no len()

print (df)
A B
0 1 d <- change data
1 2 b
2 3 c
3 4 b

d = {'a': ['x', 'y', 'z'], 'b': ['x', 'w', 'r'], 'c': ['x', 'q']}

s = [d.get(x, [x]) for x in df['B']]
print (s)
[['d'], ['x', 'w', 'r'], ['x', 'q'], ['x', 'w', 'r']]

lens = [len(x) for x in s]

from itertools import chain

df = pd.DataFrame({
'A' : df['A'].values.repeat(lens),
'B' : list(chain.from_iterable(s))
})
print (df)
A B
0 1 d
1 2 x
2 2 w
3 2 r
4 3 x
5 3 q
6 4 x
7 4 w
8 4 r

因为使用dask,另一种解决方案应该是:

d = {'a': ['x', 'y', 'z'], 'b': ['x', 'w', 'r'], 'c': ['x', 'q']}
df1 = pd.DataFrame([(k, y) for k, v in d.items() for y in v], columns=['B','C'])
print (df1)
B C
0 a x
1 a y
2 a z
3 b x
4 b w
5 b r
6 c x
7 c q

df = df.merge(df1, on='B', how='left')
print (df)
A B C
0 1 a x
1 1 a y
2 1 a z
3 2 b x
4 2 b w
5 2 b r
6 3 c x
7 3 c q
8 4 b x
9 4 b w
10 4 b r

关于pandas - 根据现有列将多行和单列添加到 Dataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54626462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com