为了账号安全,请及时绑定邮箱和手机立即绑定

向 100K+ 数据集添加行

向 100K+ 数据集添加行

守着一只汪 2022-06-22 16:27:03
我对 Python 和数据科学真的很陌生。我有一个包含 30 列的 100K+ CSV 数据集。如果满足某些条件,目标是向数据集添加一些行。为了方便起见,假设我只有三列名为“A”、“B”和“C”,A 和 B 的类型是整数。C 是一个字符串。我们不用担心 B 和 C,因为我会把所有 B 列的值都设为 0,然后我会计算 C。所以这里是我的“想象”数据集的快速视图:   A _____|  1  ||  4  ||  3  ||  7  |_______我在 Dataframe 中解析了我的数据集,并按“A”的值对其进行了排序。所以,现在,它看起来像这样:   A _____|  1  ||  3  ||  4  ||  7  |_______现在,我想遍历我的 DataFrame 并检查我是否在两行之间缺少一些数字并将它们添加到数据框中,即:如果 A[i+1]-A[i]>1,我想添加 A[i]他们之间+1。   A _____|  1  ||  2  ||  3  ||  4  ||  5  ||  6  ||  7  |_______据我所知,我有以下选择:将我的新行直接附加到新的数据框。我不知道为什么,但我认为这不是一个好主意。如果我是对的,你们能解释一下为什么吗?如果我错了,你们能解释为什么吗?将我的新行附加到一个列表中,从该列表中创建一个数据框,然后将我的旧数据框与我的新数据框“加入”。Idk,有什么建议吗?我现在的主要问题是,处理大型 DataFrame 很麻烦,而且我的脚本需要很长时间才能完成这项工作。你们能引导我找到处理如此大量数据的“正确方法”吗?顺便说一句,这是我为选择 n°2 所做的代码:df=pd.read_csv("dataset.csv")df.sort_values(by="A")L=[]for i in range (0, len(df)-1):    actual=df.at[i, 'A']    next=df.at[(i+1), 'A']    diff=actual-next-1    for j in range(1, diff):        L.append(actual+1)        actual +=1df=pd.DataFrame(data=L, columns=list(df))df.to_csv("my_output.csv", sep=',')
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

reindex

设置'A'为索引并将reindex为我们指定的每个值创建一行,使用range. 所有其他列的缺失单元格是(分别为浮点数和对象)。无需在reindex.


df = pd.DataFrame({'A': [4, 3, 1, 7], 

                   'B': [10, 11, 12, 13], 

                   'C': ['B1', 'B2', 'B3', 'B4'],

                   'D': [True, False, True, True]})


idx = range(df.A.min(), df.A.max()+1)  # All 'A' values you want to represent

df.set_index('A').reindex(idx).reset_index()

#   A     B    C      D

#0  1  12.0   B3   True

#1  2   NaN  NaN    NaN

#2  3  11.0   B2  False

#3  4  10.0   B1   True

#4  5   NaN  NaN    NaN

#5  6   NaN  NaN    NaN

#6  7  13.0   B4   True

如果'A'是重复的,那么我们需要一个outer连接来完成同样的事情。


(df.set_index('A')

   .join(pd.DataFrame(index=pd.Index(idx, name='A')), how='outer')

   .reset_index())


查看完整回答
反对 回复 2022-06-22
?
达令说

TA贡献1821条经验 获得超6个赞

让我们重新创建您的 DataFrame 并通过以下方式对其进行索引A:


rows = [1, 4, 3, 7]

df = pd.DataFrame({"A": rows, "B": [1] * len(rows), "C": ["string"] * len(rows)})

N = df.A.max()

df = df.set_index("A")

一种选择是创建一个新的 DataFrame,其中填充所有可能的条目,A并在 中使用零B:


complete_df = pd.DataFrame({"A": range(1, N + 1), "B": [0] * N})

complete_df = complete_df.set_index("A")

现在您可以使用 in 的值进行更新df并删除 on 的索引A:


complete_df = df.combine_first(complete_df)

complete_df = complete_df.reset_index()

这样,您将保留所有列,在B所有新行的列中置零,并NaN在所有其他列中置零。


分享

编辑

跟随

于 2019 年 10 月 


查看完整回答
反对 回复 2022-06-22
  • 2 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信