【问题标题】:How to drop rows with string <NA> value and trim strings from pandas data frame如何从熊猫数据框中删除带有字符串 <NA> 值的行并修剪字符串
【发布时间】:2021-12-08 20:16:15
【问题描述】:

我有以下 python 代码:

import streamlit as st
import subprocess
import pandas as pd

git_output = subprocess.run(['git', 'worktree', 'list', '--porcelain'], cwd='F:/myenv/',
                            capture_output=True,
                            text=True).stdout
    
df = pd.DataFrame([
    {line.split()[0]: line.rsplit(" ", 1) for line in block.splitlines()}
    for block in git_output.split("\n\n")])
    
st.table(df.filter(items=['worktree', 'branch']))

输出是:

    worktree                    branch
0   ["worktree","F:/demo/a"]    <NA>
1   ["worktree","F:/demo/b"]    ["branch","refs/heads/dev/demo/b"]
2   ["worktree","F:/demo/c"]    ["branch","refs/heads/dev/demo/c"]
3   <NA>                        <NA>

我可以对df 对象执行哪些操作来获得此输出:

    worktree      branch
0   [F:/demo/b]   [refs/heads/dev/demo/b]
1   [F:/demo/c]   [refs/heads/dev/demo/c]

根据 cmets,还添加了 Dictionary 值:

{'worktree': {0: ['worktree', 'F:/myenv'], 1: ['worktree', 'F:/demo/a'], 2: ['worktree', 'F:/demo/b'], 3: ['worktree', 'F:/demo/c'], 4: nan}, 'bare': {0: ['bare'], 1: nan, 2: nan, 3: nan, 4: nan}, 'HEAD': {0: nan, 1: ['HEAD', '48cfcf49e277bafad'], 2: ['HEAD', '21eae7bc2694a3aaaf'], 3: ['HEAD', '28755aad57bf4820ca5'], 4: nan}, 'branch': {0: nan, 1: ['branch', 'refs/heads/dev/demo/a'], 2: ['branch', 'refs/heads/dev/demo/b'], 3: ['branch', 'refs/heads/dev/demo/c'], 4: nan}, 'prunable': {0: nan, 1: ['prunable gitdir file points to non-existent', 'location'], 2: nan, 3: nan, 4: nan}}

【问题讨论】:

  • &lt;NA&gt; 字符串还是 nan 值?
  • 这是一个字符串..
  • 然后df[df.ne('&lt;NA&gt;').all(1)] 将删除它们。
  • 我希望它会,但我仍然可以看到具有该值的行
  • 您应该在问题中包含st.table(df.filter(items=['worktree', 'branch'])).to_dict() 的输出。

标签: python-3.x pandas dataframe


【解决方案1】:

这将起作用:

import ast
df = df.dropna().astype(str).apply(lambda col: col.apply(lambda x: ast.literal_eval(x)[-1]))

输出:

>>> df
    worktree                 branch
1  F:/demo/b  refs/heads/dev/demo/b
2  F:/demo/c  refs/heads/dev/demo/c

如果您确定包含真正的 list 对象而不仅仅是字符串,您可以省略 astype(str)ast 的东西:

df = df.dropna().apply(lambda col: col.str[-1]))

【讨论】:

  • 对于df.dropna(),它返回空结果
  • 请把print(df.head().to_dict())的结果发过来好吗?
  • 我在问题正文中添加了您提出的值
  • 哦,dropna 正在删除所有行,因为 bareprunable 列大部分是空的...
  • 所以更新您的示例数据和您的预期输出以考虑这些列。
【解决方案2】:

使用 cmets 和建议的答案这对我有用:

import streamlit as st
import subprocess
import pandas as pd
import ast


git_output = subprocess.run(['git', 'worktree', 'list', '--porcelain'], cwd='F:/views/g/MonoCentral',
                            capture_output=True,
                            text=True).stdout

df = pd.DataFrame([
    {line.split()[0]: line.rsplit(" ", 1) for line in block.splitlines()}
    for block in git_output.split("\n\n")])

df_new = df.dropna(subset=['worktree', 'HEAD', 'branch'])

df_filter = df_new.filter(items=['worktree', 'branch'])

df_filter['worktree'] = df_filter['worktree'].str[1]

df_filter['branch'] = df_filter['branch'].str[1]

st.table(df_filter)

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 2016-01-29
    • 2020-11-04
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多