Python 组合数据帧
我对熊猫很陌生。所以请容忍我。我有一个像这样的dfPython 组合数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我对熊猫很陌生。所以请容忍我。我有一个像这样的df DF1 column1 column2(ids) a [1,2,13,4,9] b [20,14,10,18,17] c [6,8,12,16,19] d [11,3,15,7,5] 每个列表中的每个数字对应于第二个数据帧中的列id DF2 id. value_to_change. 1 x1 2 x2 3 x3 4
DF1
column1 column2(ids)
a [1,2,13,4,9]
b [20,14,10,18,17]
c [6,8,12,16,19]
d [11,3,15,7,5]
每个列表中的每个数字对应于第二个数据帧中的列id
DF2
id. value_to_change.
1 x1
2 x2
3 x3
4 x4
5 x5
6 x6
7 x7
8 x8
9 x9
. .
. .
. .
20 x20
步骤1
id. value_to_change
1 x1
2 x2
13 x13
14 x14
9 x9
第二排会给我
id. value_to_change
20 x20
14 x14
10 x10
18 x18
17 x17
等等
步骤2
一旦我有了这4个数据帧,我将它们作为参数传递给一个逻辑,该逻辑返回4个数据帧。
2) 我怎样才能把它们组合成一个排序的最后一个呢
DF3
id. new_value
1 y1
2 y2
3 y3
4 y4
5 y5
6 y6
7 y7
8 y8
9 y9
. .
. .
. .
20 y20
我怎样才能做到这一点呢?首先,这段代码应该满足您的要求
import pandas as pd
idxs = [
[0,2],
[1,3],
]
df_idxs = pd.DataFrame({'idxs': idxs})
df = pd.DataFrame(
{'data': ['a', 'b', 'c', 'd']}
)
frames = []
for _, idx in df_idxs.iterrows():
rows = idx['idxs']
frame = df.loc[rows]
# some logic
print(frame)
#collect
frames.append(frame)
pd.concat(frames)
请注意,熊猫会自动创建一个范围索引,如果传递的是none。如果要选择其他列,请将该列设置为索引,或使用
df.loc[df.data.isin(rows)]
split apply联合收割机上的熊猫文档也可能会引起您的兴趣:
.loc
和.isin
在df2
pandas.concat()
.sort\u values()
将熊猫作为pd导入
df1=pd.DataFrame({'column1':['A','B','C','D','ids':[[1,2,13,4,9],[20,14,10,18,17],[6,8,12,16,19],[11,3,15,7,5]})
df2=pd.DataFrame({'ids':list(范围(1,21)),'val':[f'x{x}表示范围(1,21)]中的x)
df_列表=[]
对于df1['ids']中的id_列表。值:
df_list.append(df2.loc[df2['id'].isin(id_list)])
#在DF_列表中对每个DF执行逻辑
#假设df_列表现在包含结果数据帧
df3=pd.concat(df_列表)
df3=df3.sort_值('id'))
此代码将有助于解决问题的第一部分
import pandas as pd
df1 = pd.DataFrame([[[1,2,4,5]],[[3,4,1]]], columns=["column2(ids)"])
df2 = pd.DataFrame([[1,"x1"],[2,"x2"],[3,"x3"],[4,"x4"],[5,"x5"]], columns=["id", "value_to_change"])
df3 = pd.DataFrame(columns=["id", "value_to_change"])
for row in df1.iterrows():
s = row[1][0]
for item in s:
val = df2.loc[df2['id']==item, 'value_to_change'].item()
df_temp = pd.DataFrame([[item,val]], columns=["id", "value_to_change"])
df3 = df3.append(df_temp, ignore_index=True)
df3
注意在s=row[1][0]
行中,您需要根据您的数据帧选择索引,在我的例子中,它是[1][0]
-对于第二部分,您可以使用pd.concat
:
-对于排序
df.sort\u值
:使用这样的单个数据帧将更容易、更有效
初始化
df1 = pd.DataFrame({'label': ['A', 'B', 'C', 'D'], 'ids': [[1,2,13,4,9],
[20,14,10,18,17], [6,8,12,16,19],[11,3,15,7,5]]})
# Some custom function for dataframe operations
def my_func(x):
x['value_to_change'] = x.value_to_change.str.replace('x', 'y')
return x
数据帧操作
df1 = df1.explode('ids')
df1['value_to_change'] = df1.explode('ids')['ids'].map(dict(zip(df2.ids, df2.val)))
df1['new_value'] = df1.groupby('label').apply(my_func)['value_to_change']
输出
label ids value_to_change new_value
0 A 1 x1 y1
0 A 2 x2 y2
0 A 13 x13 y13
0 A 4 x4 y4
0 A 9 x9 y9
1 B 20 x20 y20
1 B 14 x14 y14
1 B 10 x10 y10
1 B 18 x18 y18
1 B 17 x17 y17
2 C 6 x6 y6
2 C 8 x8 y8
2 C 12 x12 y12
2 C 16 x16 y16
2 C 19 x19 y19
3 D 11 x11 y11
3 D 3 x3 y3
3 D 15 x15 y15
3 D 7 x7 y7
3 D 5 x5 y5
在手机上,因此无法测试。您可以使用DF2.loc中的每个列表来选择行。可以使用pd.concat进行最终组合。您的数据不一致。请正确格式化。@Vishnudev有什么不一致的地方吗??无论如何,我想你明白了,我觉得我的格式很好。如果你想编辑你的数据中有点
,这是有意的吗?@Vishnudev不要吝啬,问题很清楚。虽然uniXVanXcel可以包含生成这些数据帧的代码。谢谢,请让我理解并将其与我的案例相匹配,然后再与您联系。谢谢,我最终使用了他的解决方案,因为它更具可读性,但谢谢您的帮助。您不需要内部循环。只需使用df中的列表。loc@AlexNe如何在没有内部循环的情况下访问列表中的各个元素?可以使用df.loc[s]访问它们这可能是最好的答案