我有一个像这样的熊猫数据框
String = ["".join(np.random.choice(list("PQRSTUVXYZ"), size=7)) for _ in range(7)]
Position = np.random.randint(2,7, size = 7)
df=pd.DataFrame((String,Position)).T
我想在索引为列Position的字母中应用Lower()函数。
我尝试过:
df = df[0][df[1]].str.lower()
但是它降低了整个字符串。
感谢您的帮助!
答案 0 :(得分:3)
这是一个slice
和slice_replace
的列表理解:
df['new'] = ([df[0].str.slice_replace(
i,i+1,df[0].str.slice(i,i+1).iloc[e].lower()).iloc[e]
for e,i in enumerate(df[1])])
0 1 new
0 TZPVTRT 2 TZpVTRT
1 VSSXYUP 3 VSSxYUP
2 YUTXTQS 2 YUtXTQS
3 SZRURSU 5 SZRURsU
4 XRXQVUP 3 XRXqVUP
5 PSQZZVV 6 PSQZZVv
6 XYYXPYV 3 XYYxPYV
请注意,如果索引从1开始而不是0,则将df[0].str.slice(i,i+1)
替换为df[0].str.slice(i-1,i)
答案 1 :(得分:2)
您可以索引字符串。索引到下一个字符,将该字符下移,然后添加剩余的所有内容。确实与使用Series.str.slice_replace
没什么不同,但也许更具可读性。
df['new_str'] = [s[:i] + s[i].lower() + s[i+1:] for s,i in zip(df[0], df[1])]
0 1 new_str
0 TTTQTYT 3 TTTqTYT
1 USRRUZS 2 USrRUZS
2 PPXQZZT 6 PPXQZZt
3 UZZVQRQ 3 UZZvQRQ
4 ZVUQPUV 6 ZVUQPUv
5 TRPPSVU 5 TRPPSvU
6 YYZPURQ 5 YYZPUrQ