我对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 |
_______
据我所知,我有以下选择:
我现在的主要问题是,处理大型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=',')
答案 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
。