如何处理数据帧而不到处创建NaN?

2024-05-18 23:42:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组包含日期的列(从Excel文件导入),我需要按如下方式处理它们:

如果其中一列中的单元格为空,请将另一列设置为1,否则该列为0。这使我能够对所有的1求和,并显示那些项目丢失了。你知道吗

我现在就是这样做的:

df_combined['CDR_Form_notfound'] = np.where(df_combined['CDR-Form'].mask(df_combined['CDR-Form'].str.len()==0).isnull(),1,0)

我遇到的一个问题是,我必须设置这些列的格式,以便A)将日期修剪为仅显示日/月/年,B)其中一些列的值为“see notes”,而不是日期或空白。“see notes”对于正确说明丢失的项目是必不可少的,它必须在那里,以防止单元格标记为空,项目计数为丢失(添加到“空白单元格”计数)。实际的问题是,如果我在上面的.isnull代码之前运行此代码,evry blank将变为NaN、NaN或NaT,然后NOTHING将标记为null/缺失。你知道吗

这是我用来修剪日期字符串并将“see notes”更改为字符串的代码…因为否则它只会在输出中变成空白。你知道吗

for c in df_combined[dateColumns]:
        df_combined[c] = df_combined[c].astype(str) # uncomment this if columns change from dtype=str 
        df_combined[c] = np.where(df_combined[c].str.contains("20"), df_combined[c].str[:10], df_combined[c])
        df_combined[c] = np.where(df_combined[c].str.contains("see notes"), df_combined[c].str, df_combined[c])

我想我的问题可能与列的数据类型有关。当我运行print时(df.d类型),每个列都显示为“object”,除了我使用以下命令专门设置为int的列:

df_combined['Num'] = df_combined['Num'].apply(lambda x: int(x) if x == x else "")

Tags: 项目代码标记formdfnpwhere空白
2条回答

您可以使用ScheduledExecutorService,因为它的主要用途是以指定的时间间隔在单独的线程上执行任务。但您需要记住,所有与UI相关的操作都必须从EDT完成,因此您应该用SwingUtilities.invokeLater()来包装txtXPInfo更新操作:

private final ScheduledExecutorService xpInfoScheduledExecutor = Executors.newSingleThreadScheduledExecutor();
private ScheduledFuture<?> xpInfoUpdatingFuture;

public void actionPerformed() {
    StyledDocument xpInfo = txtXPInfo.getStyledDocument();
    if (btnGo.getText().equals("Go Adventure!")) {
        btnGo.setText("Stop Adventure");
        xpInfoUpdatingFuture = xpInfoScheduledExecutor.scheduleAtFixedRate(
                new XpInfoUpdater(), 0, 1, TimeUnit.SECONDS);
    } else if (btnGo.getText().equals("Stop Adventure")) {
        xpInfoUpdatingFuture.cancel(true);
        btnGo.setText("Go Adventure!");
    }
}

private class XpInfoUpdater implements Runnable {
    @Override
    public void run() {
        SwingUtilities.invokeLater(() -> {
            try {
                xpInfo.insertString(xpInfo.getLength(), "Some string\n", null);
                txtXPInfo.update(txtXPInfo.getGraphics());
            } catch (BadLocationException e) {
                System.out.println(e);
            }
        });
    }
}

我认为你的问题是你阻止了Event Thread。在Swing中,操作系统只使用一个线程来调度UI事件(比如按下按钮)

在你的例子中,似乎你在那个线程上无限循环。如果是,那么其他按钮将永远不会注册,因为该线程正忙于do/while循环

你真正想做的是启动一个不同的线程(有很多这样的例子)来执行append循环,并留下Event Thread来调度UI事件

相关问题 更多 >

    热门问题