如何使用元组(或列表)创建新列?

时间:2014-01-19 16:29:17

标签: python pandas

假设我有以下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') 。 还有更优雅的方法吗?

1 个答案:

答案 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在这一点上不能对它做任何其他事情。如果您要计算ab的不同组合并对相关的行组执行某些操作,则应使用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对这些群组执行各种摘要操作。