我有一个数据框中的列列表,我想要运行它们并对它们执行操作。列保持日期时间或没有。
对于列表中的每一列,我想修剪包含" 20"的列中的每个值。在前10个字符中,否则保持原样。
我尝试了几种方法,但却遇到了各种各样的错误或不完美的结果。
以下版本会引发错误" ' STR'对象没有属性' apply'",但如果我不使用" .astype(str)",那么我会收到"的错误类型' datetime.datetime'的参数是不可迭代的#34;。
df_combined[dateColumns] = df_combined[dateColumns].fillna(notFoundText).astype(str)
print (dateColumns)
for column in dateColumns:
for row in range(len(column)):
print(df_combined[column][row])
if "20" in (df_combined[column][row]):
df_combined[column][row].apply(lambda x: x[:10], axis=1)
print(df_combined[column][row])
HALP。提前谢谢。
答案 0 :(得分:3)
循环被认为是大熊猫的憎恶。我推荐使用str.contains
+ np.where
来做这样的事情。
for c in df.columns:
# df[c] = df[c].astype(str) # uncomment this if your columns aren't dtype=str
df[c] = np.where(df[c].str.contains("20"), df[c].str[:10], df[c])
答案 1 :(得分:3)
IIUC:
您希望在整个数据框中执行此操作
如果是这样,这是一种在整个数据帧上同时使用numpy
的矢量化方式。
设置
df = pd.DataFrame([
['xxxxxxxx20yyyy', 'z' * 14, 'wwwwwwww20vvvv'],
['k' * 14, 'dddddddd20ffff', 'a' * 14]
], columns=list('ABC'))
df
A B C
0 xxxxxxxx20yyyy zzzzzzzzzzzzzz wwwwwwww20vvvv
1 kkkkkkkkkkkkkk dddddddd20ffff aaaaaaaaaaaaaa
<强>解决方案强>
使用numpy.core.defchararray.find
和np.where
from numpy.core.defchararray import find
v = df.values.astype(str)
i, j = np.where(find(v, '20') > -1)
v[i, j] = v[i, j].astype('<U10')
df.loc[:] = v
df
A B C
0 xxxxxxxx20 zzzzzzzzzzzzzz wwwwwwww20
1 kkkkkkkkkkkkkk dddddddd20 aaaaaaaaaaaaaa
如果您不想覆盖旧数据框,可以创建一个新数据框:
pd.DataFrame(v, df.index, df.columns)
A B C
0 xxxxxxxx20 zzzzzzzzzzzzzz wwwwwwww20
1 kkkkkkkkkkkkkk dddddddd20 aaaaaaaaaaaaaa