使用枚举在 pandas 数据帧中循环
For loop in pandas dataframe using enumerate
我有一个基本数据框,它是来自不干净数据的 groupby 的结果:
df:
Name1 Value1 Value2
A 10 30
B 40 50
我创建了一个列表如下:
Segment_list = df['Name1'].unique()
Segment_list
array(['A', 'B'], dtype=object)
现在我想遍历列表并为每次迭代找到 Value1 中的数量,所以我正在使用:
for Segment_list in enumerate(Segment_list):
print(df['Value1'])
但我得到了两个值,而不是一个一个地得到。一次迭代只需要一个值。这可能吗?
Expected output:
10
40
我同意@Trenton 的评论,即使用数据框的全部意义在于避免像这样循环遍历它们。使用函数重新考虑这一点。然而,使您所写的内容发挥作用的最接近方法是这样的:
Segment_list = df['Name1'].unique()
for Index in Segment_list:
print(df['Value1'][df['Name1']==Index]).iloc[0]
如果 Name
有两个条目,则取决于您希望发生的情况(可能会发生这种情况,因为您使用 .unique()
,这将打印值的总和:
df.groupby('Name1').sum()['Value1']
- 我建议使用
pandas.DataFrame.groupby
获取每个组的值。
- 在大多数情况下,将
for-loop
与 pandas 结合使用表明它可能没有正确或有效地完成。
- 其他资源:
选项 1:
import pandas as pd
import numpy as np
import random
np.random.seed(365)
random.seed(365)
rows = 25
data = {'n': [random.choice(['A', 'B', 'C']) for _ in range(rows)],
'v1': np.random.randint(40, size=(rows)),
'v2': np.random.randint(40, size=(rows))}
df = pd.DataFrame(data)
# groupby n
for g, d in df.groupby('n'):
# print(g) # use or not, as needed
print(d.v1.values[0]) # selects the first value of each group and prints it
[out]: # first value of each group
5
33
18
选项 2:
dfg = df.groupby(['n'], as_index=False).agg({'v1': list})
# display(dfg)
n v1
0 A [5, 26, 39, 39, 10, 12, 13, 11, 28]
1 B [33, 34, 28, 31, 27, 24, 36, 6]
2 C [18, 27, 9, 36, 35, 30, 3, 0]
选项 3:
- 如评论中所述,您的数据已经是
groupby
的结果,并且它在每一组的列中只会有一个值。
dfg = df.groupby('n', as_index=False).sum()
# display(dfg)
n v1 v2
0 A 183 163
1 B 219 188
2 C 158 189
# print the value for each group in v1
for v in dfg.v1.to_list():
print(v)
[out]:
183
219
158
选项 4:
- 打印每列的所有行
dfg = df.groupby('n', as_index=False).sum()
for col in dfg.columns[1:]: # selects all columns after n
for v in dfg[col].to_list():
print(v)
[out]:
183
219
158
163
188
189
我有一个基本数据框,它是来自不干净数据的 groupby 的结果:
df:
Name1 Value1 Value2
A 10 30
B 40 50
我创建了一个列表如下:
Segment_list = df['Name1'].unique()
Segment_list
array(['A', 'B'], dtype=object)
现在我想遍历列表并为每次迭代找到 Value1 中的数量,所以我正在使用:
for Segment_list in enumerate(Segment_list):
print(df['Value1'])
但我得到了两个值,而不是一个一个地得到。一次迭代只需要一个值。这可能吗?
Expected output:
10
40
我同意@Trenton 的评论,即使用数据框的全部意义在于避免像这样循环遍历它们。使用函数重新考虑这一点。然而,使您所写的内容发挥作用的最接近方法是这样的:
Segment_list = df['Name1'].unique()
for Index in Segment_list:
print(df['Value1'][df['Name1']==Index]).iloc[0]
如果 Name
有两个条目,则取决于您希望发生的情况(可能会发生这种情况,因为您使用 .unique()
,这将打印值的总和:
df.groupby('Name1').sum()['Value1']
- 我建议使用
pandas.DataFrame.groupby
获取每个组的值。 - 在大多数情况下,将
for-loop
与 pandas 结合使用表明它可能没有正确或有效地完成。 - 其他资源:
选项 1:
import pandas as pd
import numpy as np
import random
np.random.seed(365)
random.seed(365)
rows = 25
data = {'n': [random.choice(['A', 'B', 'C']) for _ in range(rows)],
'v1': np.random.randint(40, size=(rows)),
'v2': np.random.randint(40, size=(rows))}
df = pd.DataFrame(data)
# groupby n
for g, d in df.groupby('n'):
# print(g) # use or not, as needed
print(d.v1.values[0]) # selects the first value of each group and prints it
[out]: # first value of each group
5
33
18
选项 2:
dfg = df.groupby(['n'], as_index=False).agg({'v1': list})
# display(dfg)
n v1
0 A [5, 26, 39, 39, 10, 12, 13, 11, 28]
1 B [33, 34, 28, 31, 27, 24, 36, 6]
2 C [18, 27, 9, 36, 35, 30, 3, 0]
选项 3:
- 如评论中所述,您的数据已经是
groupby
的结果,并且它在每一组的列中只会有一个值。
dfg = df.groupby('n', as_index=False).sum()
# display(dfg)
n v1 v2
0 A 183 163
1 B 219 188
2 C 158 189
# print the value for each group in v1
for v in dfg.v1.to_list():
print(v)
[out]:
183
219
158
选项 4:
- 打印每列的所有行
dfg = df.groupby('n', as_index=False).sum()
for col in dfg.columns[1:]: # selects all columns after n
for v in dfg[col].to_list():
print(v)
[out]:
183
219
158
163
188
189