gpt4 book ai didi

python - 如何根据列中的值有效地解析 Pandas Dataframe 中的子字符串?

转载 作者:行者123 更新时间:2023-11-28 22:28:02 24 4
gpt4 key购买 nike

假设,我有下表:

random_string|end_location|substring
-------------|------------|---------
HappyBirthday| 4 |Happ
GoodBye | 5 |GoodB
NaN | NaN |NaN
Haensel | 2 |Ha
... | ... |...

此表表示所需的输出。初始输入只是前两列。问题是:我如何优雅地到达那里?不应处理没有内容的行。

我尝试了以下方法:

df['random_string'].str[0:4] or [0:5]

这种方法的问题是所有字符串都将被切割成相同的长度,这不是预期的结果。

我试过:

for row in df.iterrows():
end = int(row[1]['end_location'])
df.loc[row[0], 'substring'] = row[1]['random_substring'][0:end]

这可行,但我觉得它相当不优雅且效率低下。 (How) (C/) 能否以更优雅的方式执行上述操作 - 也许是矢量化方式。也许 apply 的东西可以工作?

最佳答案

df

random_string end_location
0 HappyBirthday 4.0
1 GoodBye 5.0
2 NaN NaN
3 Haensel 2.0

使用子集

d1 = df.dropna()
rs = d1.random_string.values.tolist()
el = d1.end_location.values.astype(int).tolist() # Thx @MaxU for `astype(int)`
df.loc[d1.index, 'substring'] = [s[:n] for s, n in zip(rs, el)]

random_string end_location substring
0 HappyBirthday 4.0 Happ
1 GoodBye 5.0 GoodB
2 NaN NaN NaN
3 Haensel 2.0 Ha

时间

df = pd.concat([df] * 10**4, ignore_index=True)

%%timeit
mask = (df['random_string'].str.len() >= 0) & (df['end_location'] >= 0)
df.loc[mask, 'substring'] = [t[0][:int(t[1])] for t in df[mask].values.tolist()]
10 loops, best of 3: 26.1 ms per loop

%%timeit
d1 = df.dropna()
rs = d1.random_string.values.tolist()
el = d1.end_location.values.astype(int).tolist()
df.loc[d1.index, 'substring'] = [s[:int(n)] for s, n in zip(rs, el)]
10 loops, best of 3: 21.5 ms per loop

关于python - 如何根据列中的值有效地解析 Pandas Dataframe 中的子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43793353/

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