假设我有以下DataFrame:
d = pd.DataFrame({ 'a': [10,20,30], 'b': [1,2,3] })
a b
0 10 1
1 20 2
2 30 3
我想创建一个新列'c',它包含一个'a'和'b'元组(每行)。像这样:
a b c
0 10 1 (10,1)
1 20 2 (20,2)
2 30 3 (30,3)
我无法做到,无论我尝试什么(我用apply
尝试axis=1
并让它返回一个元组,一个列表,一个Series对象..两个都没有用。)< / p>
我看到我可以创建一个DataFrame并将dtype设置为'object'然后我可以将元组放在一个单元格中。如何使用apply
执行此操作?
我要做的是计算a和b的不同组合,得到最常见的并打印一些摘要及其中的一些数据(数据来自其他列,让我们说'd'和'e') 。 还有更优雅的方法吗?
答案 0 :(得分:3)
您可以使用zip
执行此操作:
>>> df = pd.DataFrame({'a': [10,20,30], 'b': [1,2,3]})
>>> df["c"] = zip(df["a"], df["b"])
>>> df
a b c
0 10 1 (10, 1)
1 20 2 (20, 2)
2 30 3 (30, 3)
[3 rows x 3 columns]
但通常在列中放置一个元组是错误的方法,因为pandas
在这一点上不能对它做任何其他事情。如果您要计算a
和b
的不同组合并对相关的行组执行某些操作,则应使用groupby
代替:
>>> df = pd.DataFrame({'a': [10,20,30,20,30], 'b': [1,2,3,2,1]})
>>> df
a b
0 10 1
1 20 2
2 30 3
3 20 2
4 30 1
[5 rows x 2 columns]
>>> df_counts = df.groupby(["a", "b"]).size()
>>> df_counts.sort(ascending=False)
>>> df_counts
a b
20 2 2
30 3 1
1 1
10 1 1
dtype: int64
“打印包含某些数据的摘要”过于宽泛,无法说明有用的内容,但您可以使用groupby
对这些群组执行各种摘要操作。