我有一个带有列的数据框(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)
没有运气。
答案 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}}。我目前无法想到更好的方式。