pandas 如何将某个值复制到列表中相邻的索引中?

wtlkbnrh  于 2023-09-29  发布在  其他
关注(0)|答案(3)|浏览(74)

我正在使用Pandas数据框,从Excel文件中读取。特别是有一排给我带来了麻烦。以列表形式表示,其结构如下:

lst = [0, 2022, 0, 0, 2023, 0, 0, 2024, 0] #and so forth

我想做的是把这个列表,并得到一些看起来像这样的东西:

lst = [2022, 2022, 2022, 2023, 2023, 2024, 2024, 2024] #and so on

我尝试了以下方法:

for i in range(len(lst) - 1):
    if lst[i] > 0:
        lst[i - 1] = lst[i]
        lst[i + 1] = lst[i]

但这只是返回一个完全由2022组成的列表。你将如何处理这个问题?

zlhcx6iw

zlhcx6iw1#

您应该利用Pandas的工具专门清理数据。我们可以nullify你不想要的数字,然后forward-fill一个值并回填,例如:

df = pd.DataFrame([lst])

df.where(df > 0).ffill(limit=1, axis=1).bfill(limit=1, axis=1).astype('int')
0     1     2     3     4     5     6     7     8
0  2022  2022  2022  2023  2023  2023  2024  2024  2024
jbose2ul

jbose2ul2#

原因是你操纵同一个列表。您可以创建一个新的并更新。

copied_lst = lst.copy()
for i in range(len(lst) - 1):
    if lst[i] > 0:
        copied_lst[i - 1] = lst[i]
        copied_lst[i + 1] = lst[i]
qacovj5a

qacovj5a3#

你的情况是if lst[i] > 0:。在它遇到第一个2022之后,这总是正确的,因为你遇到了lst[i + 1] = lst[i]。当你递增i并到达下一个元素时,2022将在那里,你将继续做同样的事情,直到你到达列表的末尾。
每次出现匹配时,都需要跳过一个索引。使用for很难做到这一点,但可以使用while

i = 1

while i < len(lst) - 1:
    if lst[i] > 0:
        lst[i - 1] = lst[i]
        lst[i + 1] = lst[i]
        i += 1
    i += 1

相关问题