pandas dataframe substring df ['column1']。str [:'column2']

时间:2015-01-25 20:58:30

标签: python pandas lambda substring

我有一个带有列的数据框(df)(A =对象,B = int64) 我需要的是能够得到一个' A'的子串。基于' B'。

的价值

我想得到' C'像这样:

  A      B    C
=====  =====  =========================
Jimmy  4      Jimm
Tommy  2      To
Karl   3      Kar
Jane   1      J
=====  =====  =========================

到目前为止,我试过这个:

df['C'] = df['A'].str[:df['B']]

我也试过这个:

l = (lambda x,y: str(x)[:y])

df[['A','B']].apply(l)

没有运气。

1 个答案:

答案 0 :(得分:2)

以下工作但它不会很快,因为它作为每一行的循环操作,这里的关键是传递param axis=1以按行操作,我们可以而不是访问每列的值:

In [46]:

df['C'] = df.apply(lambda x: x['A'][:x['B']], axis=1)
df
Out[46]:
       A  B     C
0  Jimmy  4  Jimm
1  Tommy  2    To
2   Karl  3   Kar
3   Jane  1     J

所以只是看看你的尝试以及他们为什么不工作:df['C'] = df['A'].str[:df['B']]这会失败,因为你试图通过传递一个系列来下标A列中的每个元素,它必须是一些常数不幸的是,这是一个不错的主意,但却没有成功。

l = (lambda x,y: str(x)[:y])
df[['A','B']].apply(l)

这不会起作用,因为df[['A', 'B']]的结果只是你原来的df,你没有指定axis来操作,所以默认为{{1}这是列式的,实际上你的lambda现在失败了,因为只有一个param被传递,在第一次迭代时它将是0,所以使这个工作的唯一方法是通过传递param来逐行操作{ {1}}。我目前无法想到更好的方式。