向100K +数据集中添加行

时间:2019-10-11 19:12:27

标签: python pandas dataset data-science

我对Python和数据科学真的很陌生。

我有一个包含30列的100K + CSV数据集。目的是在满足某些条件的情况下向数据集中添加一些行。

为使事情变得简单,假设我只有三个列,分别为“ A”,“ B”和“ C”,A和B的类型为整数。 C是一个字符串。

让我们不必担心B和C,因为我会将所有B列的值都设为0,然后稍后再计算C。

下面是我的“虚构”数据集的快速视图:

   A
 _____
|  1  |
|  4  |
|  3  |
|  7  |
_______

我在数据框中解析了数据集,并按“ A”的值对其进行了排序。

所以,现在看起来像这样:

   A
 _____
|  1  |
|  3  |
|  4  |
|  7  |
_______

现在,我想遍历DataFrame并检查im是否在两行之间缺少一些数字并将其添加到dataframe中,即:如果A [i + 1] -A [i]> 1,我想添加A他们之间[i] +1。

   A
 _____
|  1  |
|  2  |
|  3  |
|  4  |
|  5  |
|  6  |
|  7  |
_______

据我所知,我有以下选择:

  1. 将我的新行直接附加到新的数据框。我不知道为什么 但我认为这不是一个好主意。如果我说得对,你们可以吗 解释为什么 ?如果我做错了,你们能解释为什么吗?
  2. 将我的新行追加到列表中,从该列表中创建一个DataFrame,然后将我的旧DataFrame与我的新行“连接”。
  3. 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 +=1
df=pd.DataFrame(data=L, columns=list(df))
df.to_csv("my_output.csv", sep=',')

2 个答案:

答案 0 :(得分:3)

reindex

'A'设置为索引,reindex将为我们指定的每个值创建一行,并用range完成。其他所有列的缺失像元是(分别为float和object)。无需在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())

答案 1 :(得分:0)

让我们重新创建您的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")

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

complete_df = df.combine_first(complete_df)
complete_df = complete_df.reset_index()

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