gpt4 book ai didi

python - 如何在 Pandas 中交换一组列标题及其值

转载 作者:太空狗 更新时间:2023-10-29 21:21:49 24 4
gpt4 key购买 nike

我有以下数据框:

a1  | a2  | a3  | a4 
---------------------
Bob | Cat | Dov | Edd
Cat | Dov | Bob | Edd
Edd | Cat | Dov | Bob

我想把它转换成

Bob | Cat | Dov | Edd
---------------------
a1 | a2 | a3 | a4
a3 | a1 | a2 | a4
a4 | a2 | a3 | a1

请注意,列数等于唯一值的数量,行数和行序保持不变

最佳答案

1) 所需方法:

更快的实现是对数据框的值进行排序,并根据它在 np.argsort 之后获得的索引相应地对齐列。 .

pd.DataFrame(df.columns[np.argsort(df.values)], df.index, np.unique(df.values))

enter image description here

应用 np.argsort 为我们提供了我们正在寻找的数据:

df.columns[np.argsort(df.values)]
Out[156]:
Index([['a1', 'a2', 'a3', 'a4'], ['a3', 'a1', 'a2', 'a4'],
['a4', 'a2', 'a3', 'a1']],
dtype='object')

2) 慢速通用方法:

更通用的方法是在创建数据帧中存在的字符串/值与其对应的 dict 映射之后使用 apply对应的列名。

在将获得的系列转换为它们的list 表示后,稍后使用数据框构造函数。

pd.DataFrame(df.apply(lambda s: dict(zip(pd.Series(s), pd.Series(s).index)), 1).tolist()) 

3) 更快的通用方法:

df.to_dict + orient='records' 获得字典列表后,我们需要交换它各自的键和值对,同时在循环。

pd.DataFrame([{val:key for key, val in d.items()} for d in df.to_dict('r')])

示例测试用例:

df = df.assign(a5=['Foo', 'Bar', 'Baz'])

这两种方法都会产生:

enter image description here


@piRSquared 编辑 1

通用解决方案

def nic(df):
v = df.values
n, m = v.shape
u, inv = np.unique(v, return_inverse=1)
i = df.index.values
c = df.columns.values
r = np.empty((n, len(u)), dtype=c.dtype)
r[i.repeat(m), inv] = np.tile(c, n)
return pd.DataFrame(r, i, u)

1 感谢用户@piRSquared感谢他们提出了一个非常快速且通用的基于 numpy 的替代解决方案。

关于python - 如何在 Pandas 中交换一组列标题及其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41572822/

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